よく使うDockerfileのコマンドまとめ(その1)

こんにちは!kossyです!





さて、今回はDockerfileでよく使うコマンドをまとめてみたいと思います。




FROM

https://docs.docker.jp/engine/reference/builder.html#id43

ビルドするイメージのベースイメージを指定します。取得するイメージはDocker Hubのパブリックレジストリから取得されます。

FROM ruby:2.6
FROM node

のように指定することでイメージを指定できます。
ruby:2.6のように:の後の数字はタグと呼ばれるもので、特に指定しない場合はlatestタグが付されたイメージが取得されます。

RUN

https://docs.docker.jp/engine/reference/builder.html#id45

イメージをビルドする際、コンテナで実行するコマンドを定義するものです。

FROM ruby:2.6

RUN mkdir /myapp

RUNを記述した後に、linuxコマンド等を割り当てることで、コンテナ内で実行されるようになります。

COPY

https://docs.docker.jp/engine/reference/builder.html#copy

ホスト側からコンテナ側にファイルやディレクトリをコピーしたい時に使います。

FROM ruby:2.6

RUN mkdir /myapp

COPY Gemfile /myapp/Gemfile

srcにはワイルドカードも指定することできます。

FROM ruby:2.6

RUN mkdir /myapp

COPY Gem* /myapp

Gem*はGemから始まる名前が付けられたファイル全てを追加するのを想定しています。
Railsの場合だとGemfileとGemfile.lockが追加されると思います。


ADD

https://docs.docker.jp/engine/reference/builder.html#add

COPYの機能に加えて、アーカイブの自動展開やURLを指定してファイル・ディレクトリをコンテナに追加。
OSのベースイメージ作成時のような特殊なケースで活用されます。

FROM alpine

# Auto unarchive
ADD add.txt.gz /tmp

# Can ADD from remote
ADD https://github.com/github/fetch/blob/master/README.md /tmp

出典: https://qiita.com/YumaInaura/items/1647e509f83462a37494

COPYとの違いは以下の点があります。
・リモートサーバーからもファイルを追加できる
・圧縮ファイルが自動解凍される

こちらの記事によると、ADDよりもCOPYコマンドを使った方がいいとのことです。(公式もその見解らしい)



CMD

https://docs.docker.jp/engine/reference/builder.html#cmd

コンテナがフォアグラウンドで実行するコマンドを定義できます。

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

出典: https://qiita.com/kodai_0122/items/795438d738386c2c1966

Dockerfile内ではCMDコマンドは1つしか記述できません。
2つ目のCMDコマンドを記述した場合、1つ目のCMDコマンドは無視され、2つ目のものしか実行されないので注意してください。


ENTRYPOINT

https://docs.docker.jp/engine/reference/builder.html#entrypoint

コンテナを実行可能ファイルとして使用する際に定義するコマンドで、
CMDとENTRYPOINTは併用可能です。

FROM ruby:2.6

ENTRYPOINT ["ruby"]
CMD [""]

この状態のDockerfileをbuildして実行すると、

docker image build -t test/ruby2.6
docker container run -it test/ruby2.6 version

のように、rubyコマンドを省略して実行することができます。


ARG

https://docs.docker.jp/engine/reference/builder.html#arg

docker image build に利用する変数を設定できます。
イメージビルド時のみ使用できる一時的な環境変数です。

Rails向けのDockerfileだと思ってください


ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
docker build --build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY} ...

上記のようにmaster.keyを環境変数として渡すことで、動的にmaster.keyを渡すことができます。

出典: https://qiita.com/hiko1129/items/c0a27ce0c46fcaeaac7b


ENV

https://docs.docker.jp/engine/reference/builder.html#env

コンテナ内に環境変数を定義するために用いられます。

ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}

ENVを用いて設定された環境変数は、そのイメージから実行されたコンテナであれば維持され、
コンテナ内部で使用することができます。

上記の例では、コンテナ内でmaster.keyを参照できるようにENVで環境変数化しています。





参考にさせていただいた記事・書籍
https://docs.docker.jp/engine/reference/builder.html
https://qiita.com/YumaInaura/items/1647e509f83462a37494
https://qiita.com/momotaro98/items/bf34eef176cc2bdb6892
https://qiita.com/kodai_0122/items/795438d738386c2c1966
https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770#env%E3%81%A8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91