はじめに
今回は前回に引き続き、Dockerの基本的な書き方を紹介します。
本家のBest practices for writing Dockerfilesから抽出しました。
動画で確認したい方はこちらをどうぞ。
【YouTube動画】 Dockerfileのベストプラクティスを紹介! あなたはいくつできてますか?
.dockerignoreを使う
.gitignoreみたいなファイルで、コンテナに加えないファイルを設定できます。
# .dockerignore
*/tmp
コンテナ1つに1プロセス
1つのコンテナ (Dockerfile) でRailsやMySQL, Nginxなどを起動するのは止めましょう。
バージョンアップが難しくなりますし、原因の切り分けも大変です。
レイヤ数を最小にする
DockerはRUN, ADD, COPYを実行するたびに、一時的にイメージが作られます。
Dockerfileの読みやすさにも関わってくるので、なるべく分けないようにしましょう。
マルチステージビルドを使う
以下のようにFROM内のAS句で名前付けします。
名前付けしたものを新しくレイヤーを作り直す時に宣言することで、中間のイメージを除くことができます。
例ではGoを使ってますが、Nodeでも役立ちそうです。
FROM golang:1.11-alpine AS build
#### パッケージ導入 & ビルド ####
RUN apk add --no-cache git
RUN go get github.com/golang/dep/cmd/dep
COPY Gopkg.lock Gopkg.toml /go/src/project/
WORKDIR /go/src/project/
RUN dep ensure -vendor-only
COPY . /go/src/project/
RUN go build -o /bin/project
#### ビルド終了 ####
# 新しくレイヤーを作り直す
FROM scratch
COPY --from=build /bin/project /bin/project
ENTRYPOINT ["/bin/project"]
CMD ["--help"]
引数は適切に!
引数はアルファベット順に並べると、可読性が上がります。
RUN apt-get update && apt-get install -y bzr cvs git
alpineイメージで軽くする
alpineイメージを使うと、容量を小さくできます (5 M以下)。
ちなみに、alpineはBusyBoxにパッケージマネージャー apkを加えたイメージです。
ホストOSの負荷を小さくできるので、開発環境とかで良いかもしれません。
upgradeはしない
upgradeするなら、ベースイメージのバージョンを上げましょう。
ADDよりもCOPYを使う
ADDは多機能なコマンドで、予期しない動きをすることがあります。
ホストOSからゲストOSにファイルを移動させるなら、COPYを使いましょう。
rootユーザーを使わない
セキュリティ上あまりよろしくないので、USERを追加する方が良いです。
まとめ
今回はDockerfileの書き方を紹介しました。
具体的な書き方や使い方は、別記事で紹介します!
twitterやyoutubeでのコメントもお待ちしています!
追記
より詳しい話は@zembutsu さんによる訳を読んでみると良さそうです!
Dockerfileを書くためのベストプラクティス【参考訳】