Dockerfileとは
Dockerイメージの中身を定義する設定ファイルになります.
Vagrantを利用した方がある方は,Vagrantfileを思い出して頂くとイメージしやすいかも知れません.
題材
https://github.com/tozastation/gRPC-Training-Golang
を使って説明していきます.APIサーバのイメージ作りです.
Dockerfileに記載する流れ
- ベースとなるイメージの指定
- プログラムを動作するのに必要なパッケージの導入
- ポート開放
- プログラム起動コマンド
Dockerfile(Multi Stage Build)
以下Dockerfileの例になります.
FROM
が2箇所あると思います.
イメージを2個取得していることになりますが,これには理由があります.
golang:latest
というイメージの中にはGoの実行環境が入ってる訳だが,これが772MBというサイズを要する.今後,コンテナをポコポコ立てて行くとなると,なるべく起動を軽量化したいとなると思います.
そこで,Multi Stage Buildです.
# Build Container
FROM golang:latest as builder
WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
COPY . .
# Set Environment Variable
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
# Build
RUN go build -o app main.go
# Runtime Container
FROM alpine
RUN apk add --no-cache ca-certificates
COPY --from=builder /go/src/github.com/tozastation/gRPC-Training-Golang/app /app
ENV CONNECTION_STRING=Data Source=127.0.0.1:1433;Initial Catalog=Weather;User ID=SA;Password=Test@1234
ENV VENDER=mssql
ENV OPENWEATHER_URL=http://api.openweathermap.org/data/2.5/weather
ENV OPENWEATHER_CREDENTIAL=&APPID=1e16e8941ce99bdd844d129d5179d98a
EXPOSE 3001
ENTRYPOINT ["/app"]
Multi Stage Build
これは,ビルド環境から成果物を生成し,実行に必要な成果物のみを超軽量のベースイメージに移すことで,
Dockerイメージの容量を最小限にすることができます.
先ほどのgolang:latest
は772MBでしたが,今回作成したイメージは21.2MBになります.圧倒的ですね.
Go言語との相性
Goのコンパイルは,シングルバイナリになります.
排出される1ファイルのみを運べば,実行可能な環境が整います.
Runtime用の特殊なパッケージを用意する必要もなく,alpine
という軽量なLinuxイメージのみで動きます.
Dockerとの相性もバッチリ
書き方(やっと)
基本的なDockerfileの構文は,以下のキーワードのみです.
Linux環境をShellコマンドで整えたことがある方はすんなりいけるかもしれません.
使いそうな順に書いています.大体これで作れるので,他にも知りたい方は公式サイトを参照ください!
FROM ベースイメージの取得
# FROM golang:latest
WORKDIR 作業ディレクトリの指定(存在しない場合は自動で作ります.)
# WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
ADD ローカルファイルをDockerイメージ内にコピーする(圧縮ファイルが自動解凍される)
# ADD: . .
COPY 同上(圧縮ファイルが自動解凍されない)
# COPY: . .
RUN Shellコマンドの実行
# RUN apt-get install -y vim
ENV 環境変数を定義
# ENV PORT=3306
EXPOSE 開放するポート番号
# EXPOSE 3306
ENTRYPOINT 実行するコマンドを指定
# ENTRYPOINT ["/app"]
※ Multi Stage Buildで必要な項目は,FROMをビルド用と実行用で2つ用いる事,実行用イメージに成果物をCOPY
で移すことくらいと手軽にできますので説明は割愛します.