├── .gitignore ├── add ├── Dockerfile └── text │ ├── eko.txt │ ├── pzn.txt │ └── world.txt ├── arg ├── Dockerfile └── main.go ├── command └── Dockerfile ├── copy ├── Dockerfile └── text │ ├── eko.txt │ ├── pzn.txt │ └── world.txt ├── entrypoint ├── Dockerfile └── main.go ├── env ├── Dockerfile └── main.go ├── expose ├── Dockerfile └── main.go ├── from └── Dockerfile ├── health ├── Dockerfile └── main.go ├── ignore ├── .dockerignore ├── Dockerfile └── text │ ├── app.log │ ├── sample.log │ ├── temp │ └── sample.txt │ └── world.txt ├── label └── Dockerfile ├── multi ├── Dockerfile └── main.go ├── run └── Dockerfile ├── script.sh ├── user ├── Dockerfile └── main.go ├── volume ├── Dockerfile └── main.go └── workdir ├── Dockerfile └── main.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /add/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | RUN mkdir hello 5 | ADD text/*.txt hello 6 | 7 | CMD cat "hello/world.txt" -------------------------------------------------------------------------------- /add/text/eko.txt: -------------------------------------------------------------------------------- 1 | Eko Kurniawan -------------------------------------------------------------------------------- /add/text/pzn.txt: -------------------------------------------------------------------------------- 1 | Programmer Zaman Now -------------------------------------------------------------------------------- /add/text/world.txt: -------------------------------------------------------------------------------- 1 | Hello World -------------------------------------------------------------------------------- /arg/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | ARG app=main 5 | 6 | RUN mkdir app 7 | COPY main.go app 8 | RUN mv app/main.go app/${app}.go 9 | 10 | EXPOSE 8080 11 | 12 | ENV app=${app} 13 | CMD go run app/${app}.go -------------------------------------------------------------------------------- /arg/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | -------------------------------------------------------------------------------- /command/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | RUN mkdir hello 5 | RUN echo "Hello World" > "hello/world.txt" 6 | 7 | CMD cat "hello/world.txt" -------------------------------------------------------------------------------- /copy/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | RUN mkdir hello 5 | COPY text/*.txt hello 6 | 7 | CMD cat "hello/pzn.txt" -------------------------------------------------------------------------------- /copy/text/eko.txt: -------------------------------------------------------------------------------- 1 | Eko Kurniawan -------------------------------------------------------------------------------- /copy/text/pzn.txt: -------------------------------------------------------------------------------- 1 | Programmer Zaman Now -------------------------------------------------------------------------------- /copy/text/world.txt: -------------------------------------------------------------------------------- 1 | Hello World -------------------------------------------------------------------------------- /entrypoint/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | RUN mkdir /app/ 5 | COPY main.go /app/ 6 | 7 | EXPOSE 8080 8 | 9 | ENTRYPOINT ["go", "run"] 10 | 11 | CMD ["/app/main.go"] -------------------------------------------------------------------------------- /entrypoint/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | -------------------------------------------------------------------------------- /env/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | ENV APP_PORT=8080 5 | 6 | RUN mkdir app 7 | COPY main.go app 8 | 9 | EXPOSE ${APP_PORT} 10 | 11 | CMD go run app/main.go -------------------------------------------------------------------------------- /env/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "os" 7 | ) 8 | 9 | func main() { 10 | port := os.Getenv("APP_PORT") 11 | fmt.Println("Run app in port : " + port) 12 | http.HandleFunc("/", HelloServer) 13 | http.ListenAndServe(":"+port, nil) 14 | } 15 | 16 | func HelloServer(w http.ResponseWriter, r *http.Request) { 17 | fmt.Fprintf(w, "Hello, World!") 18 | } 19 | -------------------------------------------------------------------------------- /expose/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | RUN mkdir app 5 | COPY main.go app 6 | 7 | EXPOSE 8080 8 | 9 | CMD go run app/main.go -------------------------------------------------------------------------------- /expose/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | -------------------------------------------------------------------------------- /from/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | -------------------------------------------------------------------------------- /health/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.18-alpine 2 | 3 | RUN apk --no-cache add curl 4 | RUN mkdir app 5 | 6 | COPY main.go app 7 | 8 | EXPOSE 8080 9 | 10 | HEALTHCHECK --interval=5s --start-period=5s CMD curl -f http://localhost:8080/health 11 | 12 | CMD go run app/main.go -------------------------------------------------------------------------------- /health/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | var counter = 0 9 | 10 | func main() { 11 | http.HandleFunc("/", HelloServer) 12 | http.HandleFunc("/health", HealthCheck) 13 | 14 | http.ListenAndServe(":8080", nil) 15 | } 16 | 17 | func HealthCheck(w http.ResponseWriter, r *http.Request) { 18 | counter = counter + 1 19 | if counter > 5 { 20 | w.WriteHeader(500) 21 | fmt.Fprintf(w, "KO") 22 | } else { 23 | fmt.Fprintf(w, "OK") 24 | } 25 | } 26 | 27 | func HelloServer(w http.ResponseWriter, r *http.Request) { 28 | fmt.Fprintf(w, "Hello, World!") 29 | } 30 | -------------------------------------------------------------------------------- /ignore/.dockerignore: -------------------------------------------------------------------------------- 1 | text/*.log 2 | text/temp -------------------------------------------------------------------------------- /ignore/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3 2 | 3 | RUN mkdir hello 4 | COPY text/* hello 5 | 6 | CMD ls -l hello -------------------------------------------------------------------------------- /ignore/text/app.log: -------------------------------------------------------------------------------- 1 | This is app log -------------------------------------------------------------------------------- /ignore/text/sample.log: -------------------------------------------------------------------------------- 1 | This is sample log -------------------------------------------------------------------------------- /ignore/text/temp/sample.txt: -------------------------------------------------------------------------------- 1 | This is sample text -------------------------------------------------------------------------------- /ignore/text/world.txt: -------------------------------------------------------------------------------- 1 | Hello World -------------------------------------------------------------------------------- /label/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | LABEL author="Eko Kurniawan Khannedy" 5 | LABEL company="Programmer Zaman Now" website="https://www.programmerzamannow.com/" 6 | 7 | RUN mkdir hello 8 | RUN echo "Hello World" > "hello/world.txt" 9 | 10 | CMD cat "hello/world.txt" -------------------------------------------------------------------------------- /multi/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine as builder 3 | WORKDIR /app/ 4 | COPY main.go /app/ 5 | RUN go build -o /app/main /app/main.go 6 | 7 | FROM alpine:3 8 | WORKDIR /app/ 9 | COPY --from=builder /app/main /app/ 10 | CMD /app/main -------------------------------------------------------------------------------- /multi/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | -------------------------------------------------------------------------------- /run/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM alpine:3 3 | 4 | RUN mkdir hello 5 | RUN echo "Hello World" > "hello/world.txt" 6 | RUN cat "hello/world.txt" -------------------------------------------------------------------------------- /script.sh: -------------------------------------------------------------------------------- 1 | 2 | # FROM Instruction 3 | docker build -t khannedy/from from 4 | 5 | docker image ls 6 | 7 | # RUN Instruction 8 | docker build -t khannedy/run run 9 | 10 | docker build -t khannedy/run run --progress=plain --no-cache 11 | 12 | # CMD Instruction 13 | docker build -t khannedy/command command 14 | 15 | docker image inspect khannedy/command 16 | 17 | docker container create --name command khannedy/command 18 | 19 | docker container start command 20 | 21 | docker container logs command 22 | 23 | # LABEL Instruction 24 | docker build -t khannedy/label label 25 | 26 | docker image inspect khannedy/label 27 | 28 | # ADD Instruction 29 | docker build -t khannedy/add add 30 | 31 | docker container create --name add khannedy/add 32 | 33 | docker container start add 34 | 35 | docker container logs add 36 | 37 | # COPY Instruction 38 | docker build -t khannedy/copy copy 39 | 40 | docker container create --name copy khannedy/copy 41 | 42 | docker container start copy 43 | 44 | docker container logs copy 45 | 46 | # .dockerignore 47 | docker build -t khannedy/ignore ignore 48 | 49 | docker container create --name ignore khannedy/ignore 50 | 51 | docker container start ignore 52 | 53 | docker container logs ignore 54 | 55 | # EXPOSE Instruction 56 | docker build -t khannedy/expose expose 57 | 58 | docker image inspect khannedy/expose 59 | 60 | docker container create --name expose -p 8080:8080 khannedy/expose 61 | 62 | docker container start expose 63 | 64 | docker container ls 65 | 66 | docker container stop expose 67 | 68 | # ENV Instruction 69 | docker build -t khannedy/env env 70 | 71 | docker image inspect khannedy/env 72 | 73 | docker container create --name env --env APP_PORT=9090 -p 9090:9090 khannedy/env 74 | 75 | docker container start env 76 | 77 | docker container ls 78 | 79 | docker container logs env 80 | 81 | docker container stop env 82 | 83 | # VOLUME Instruction 84 | docker build -t khannedy/volume volume 85 | 86 | docker image inspect khannedy/volume 87 | 88 | docker container create --name volume -p 8080:8080 khannedy/volume 89 | 90 | docker container start volume 91 | 92 | docker container logs volume 93 | 94 | docker container inspect volume 95 | 96 | #15a53c9a60b9aaddb3c294cde03e6f283f319acf0db3e40c5d4b4a992a6451f1 97 | 98 | docker volume ls 99 | 100 | # WORKDIR Instruction 101 | docker build -t khannedy/workdir workdir 102 | 103 | docker container create --name workdir -p 8080:8080 khannedy/workdir 104 | 105 | docker container start workdir 106 | 107 | docker container exec -i -t workdir /bin/sh 108 | 109 | # USER Instruction 110 | docker build -t khannedy/user user 111 | 112 | docker container create --name user -p 8080:8080 khannedy/user 113 | 114 | docker container start user 115 | 116 | docker container exec -i -t user /bin/sh 117 | 118 | # ARG Instruction 119 | docker build -t khannedy/arg arg --build-arg app=pzn 120 | 121 | docker container create --name arg -p 8080:8080 khannedy/arg 122 | 123 | docker container start arg 124 | 125 | docker container exec -i -t arg /bin/sh 126 | 127 | # HEALTHCHECK Instruction 128 | docker build -t khannedy/health health 129 | 130 | docker container create --name health -p 8080:8080 khannedy/health 131 | 132 | docker container start health 133 | 134 | docker container ls 135 | 136 | docker container inspect health 137 | 138 | # ENTRYPOINT Instruction 139 | docker build -t khannedy/entrypoint entrypoint 140 | 141 | docker image inspect khannedy/entrypoint 142 | 143 | docker container create --name entrypoint -p 8080:8080 khannedy/entrypoint 144 | 145 | docker container start entrypoint 146 | 147 | # Multi Stage Build 148 | docker build -t khannedy/multi multi 149 | 150 | docker image ls 151 | 152 | docker container create --name multi -p 8080:8080 khannedy/multi 153 | 154 | docker container start multi 155 | 156 | # Docker Push 157 | docker tag khannedy/multi registry.digitalocean.com/programmerzamannow/multi 158 | 159 | docker --config /Users/khannedy/.docker-digital-ocean/ push registry.digitalocean.com/programmerzamannow/multi 160 | 161 | docker --config /Users/khannedy/.docker-digital-ocean/ pull registry.digitalocean.com/programmerzamannow/multi -------------------------------------------------------------------------------- /user/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.18-alpine 2 | 3 | RUN mkdir /app 4 | 5 | RUN addgroup -S pzngroup 6 | RUN adduser -S -D -h /app pznuser pzngroup 7 | RUN chown -R pznuser:pzngroup /app 8 | 9 | USER pznuser 10 | 11 | COPY main.go /app 12 | 13 | EXPOSE 8080 14 | CMD go run /app/main.go -------------------------------------------------------------------------------- /user/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | -------------------------------------------------------------------------------- /volume/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | ENV APP_PORT=8080 5 | ENV APP_DATA=/logs 6 | 7 | RUN mkdir ${APP_DATA} 8 | RUN mkdir app 9 | COPY main.go app 10 | 11 | EXPOSE ${APP_PORT} 12 | VOLUME ${APP_DATA} 13 | 14 | CMD go run app/main.go -------------------------------------------------------------------------------- /volume/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "net/http" 7 | "os" 8 | ) 9 | 10 | func main() { 11 | port := os.Getenv("APP_PORT") 12 | fmt.Println("Run app in port : " + port) 13 | http.HandleFunc("/", HelloServer) 14 | http.ListenAndServe(":"+port, nil) 15 | } 16 | 17 | func HelloServer(w http.ResponseWriter, r *http.Request) { 18 | fmt.Fprintf(w, "Hello, %s", r.URL.Path[1:]) 19 | 20 | dataString := "Hello " + r.URL.Path[1:] 21 | dataBytes := []byte(dataString) 22 | 23 | destination := os.Getenv("APP_DATA") 24 | file := destination + "/" + r.URL.Path[1:] + ".txt" 25 | err := ioutil.WriteFile(file, dataBytes, 0666) 26 | if err != nil { 27 | panic(err) 28 | } 29 | fmt.Println("DONE Write File : " + file) 30 | } 31 | -------------------------------------------------------------------------------- /workdir/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM golang:1.18-alpine 3 | 4 | WORKDIR /app 5 | COPY main.go /app 6 | 7 | EXPOSE 8080 8 | CMD go run main.go -------------------------------------------------------------------------------- /workdir/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", HelloServer) 10 | http.ListenAndServe(":8080", nil) 11 | } 12 | 13 | func HelloServer(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello, World!") 15 | } 16 | --------------------------------------------------------------------------------