main.go
package main import( "net/http" "fmt" ) func main(){ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, "hello go") }) http.ListenAndServe(":80", nil) }
Dockerfile
From golang:1.13.4-alpine3.10 WORKDIR /src COPY ./main.go /src RUN go build -o /usr/local/bin/startapp main.go WORKDIR / CMD ["/usr/local/bin/startapp"]
$ sudo docker image build ./ -t c4app3
$ sudo docker run –rm -d -p 8080:80 –name myapp c4app3
1. イメージ作成に必要な作業を別のコンテナで実施
2. 作業用コンテナで作成したイメージから本番ようイメージで使うデータを持ってくる
as builderとして1つ目の作業イメージに名前を与え、2つ目のイメージ後半で–from=builderとしてバイナリファイルをイメージ内部にコピー
From golang:1.13.4-alpine3.10 as builder WORKDIR /src COPY ./main.go /src RUN go build -o start_appserver main.go From alpine:3.10.3 COPY --from=builder /src/start_appserver /bin/start_appserver CMD ["/bin/start_appserver"]
OSを搭載しないイメージ(Scratchと呼ぶ)
こうも書ける
From golang:1.13.4-alpine3.10 as builder WORKDIR /src COPY ./main.go /src RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a installsuffix cgo -o startapp main.go From scratch COPY --from=builder /src/startapp /startapp CMD ["/startapp"]
自分が手動で展開できないものはDockerfile上の手順に落とし込むことはできない
– スクリプト構成を理解
– 公式を展開
– 機能を追加
などを手を動かしてやる
差分イメージは減らす
RUN yum update \ && yum install -y \ package-bar \ package-baz \ package-foo \ && rm -rf /var/cache/yum/* \ && yum clean all