search
LoginSignup
203

More than 1 year has passed since last update.

posted at

updated at

Dockerfile の ベストプラスクティス を抽出しました!

はじめに

今回は前回に引き続き、Dockerの基本的な書き方を紹介します。

本家のBest practices for writing Dockerfilesから抽出しました。

動画で確認したい方はこちらをどうぞ。
【YouTube動画】 Dockerfileのベストプラクティスを紹介! あなたはいくつできてますか?
Collation

.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の書き方を紹介しました。
具体的な書き方や使い方は、別記事で紹介します!

twitteryoutubeでのコメントもお待ちしています!

追記

より詳しい話は@zembutsu さんによる訳を読んでみると良さそうです!
Dockerfileを書くためのベストプラクティス【参考訳】

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
What you can do with signing up
203