[Docker] goのイメージ作成

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