Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@tozastation

Dockerfileの書き方 ~Multi Stage Build~

More than 1 year has passed since last update.

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で移すことくらいと手軽にできますので説明は割愛します.

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
fun-ac
2000年に開学した公立大学です。「プロジェクト型学習」など、実践的な教育を全国に先駆けて導入しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?