11
6

More than 5 years have passed since last update.

Dockerfileの書き方 ~Multi Stage Build~

Posted at

Dockerfileとは

Dockerイメージの中身を定義する設定ファイルになります.
Vagrantを利用した方がある方は,Vagrantfileを思い出して頂くとイメージしやすいかも知れません.

題材

https://github.com/tozastation/gRPC-Training-Golang
を使って説明していきます.APIサーバのイメージ作りです.

Dockerfileに記載する流れ

  1. ベースとなるイメージの指定
  2. プログラムを動作するのに必要なパッケージの導入
  3. ポート開放
  4. プログラム起動コマンド

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:latest772MBでしたが,今回作成したイメージは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で移すことくらいと手軽にできますので説明は割愛します.

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6