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