エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。
サイトをリニューアルしました

よく利用するDockerfileの命令まとめ(これだけ覚えておけばOK)

FROM

ベースイメージを指定する。

# nodeのバージョン20をベースイメージとして指定する
FROM node:20

ベースイメージはここで探すことができる。

Icon in a page linkhub.docker.com

MySQLの環境、nginxの環境など
作りたいものに応じて最適化されたイメージが配信されているので、それを使うと良い。

WORKDIR(作業ディレクトリの指定)

Dockerfileで定義した命令を実行するための作業ディレクトリを指定する命令。

もし指定したディレクトリが存在しなければ新たに作成する。

ADD(ファイル、ディレクトリの追加)

イメージに対して、ホストマシン上にあるファイルやディレクトリを追加するときに使う。

  • URLを指定してリモートファイルを追加することもできる
    • ファイルのダウンロードに認証が必要な場合はRUN命令でcurlやwgetを使う必要あり
  • ホストマシンのファイルがtarアーカイブ、圧縮フォーマットのときはディレクトリとして展開される
    • リモートURLからダウンロードしたものは展開されない

COPY(ファイルのコピー)

イメージに対して、ホストマシン上にあるファイルやディレクトリをコピーするときに使う。

ADDとCOPYの違い

単純にイメージ内にファイルを配置したいだけの時はCOPY命令を使えばよい

  • ADD:リモートファイルのダウンロードやアーカイブの解凍機能を持つ
  • COPY:ホスト上のファイルをイメージにコピーする処理だけを行う

RUN(コマンドの実行)

インストールや初期セットアップを行うためのコマンド。

  • アプリケーションのインストール( npm installなど)するときに使う
  • 環境構築のためのコマンドを実行するときに使う
  • バックスラッシュを使って行を分けることで読みやすくすることができる(これは通常のシェルと同じ)
# apt-getの更新をしてから、vimをインストールする
RUN apt-get update && \
  apt-get install -y vim

RUNコマンドは1行にまとめるほうが完成したDockerイメージの容量を抑えることができるので
できる限り1行にまとめておくことをおすすめする。

CMD(デーモンの実行)

コンテナを立ち上げる時、「コンテナに対して何もオプションを設定しなければ自動的に実行するコマンド」を設定する。

言い換えると、優先度は「CMD指定<実行時引数」

例えば、ubuntuのイメージは
コンテナ起動時に何もオプションが指定されなければ /bin/bashを起動するようになっている。

Icon in a page linkhub.docker.com

Image in a image block
  • 生成したコンテナ内でコマンドを実行するときに使う
    • 例:インストールしたnginxをデーモンとしてコンテナ内で常時動作させる
  • この命令は1つのみ記述可能(複数指定した場合は最後の命令のみが有効になる)

ENTRYPOINT(デーモンの実行)

コンテナ起動時に強制的に実行されるコマンド。

  • 明示的に起動時の --entrypointオプションを指定しない限り実行される
  • イメージからDockerコンテナを起動するdocker container runを実行したときに実行される

上書きする方法はこちらで解説している。

📄Arrow icon of a page link【Docker Compose】コンテナ内部のデバッグする

CMDとENTRYPOINTの違い

docker container runコマンド実行時の動作に違いがある。

  • ENTRYPOINT:必ず実行
    • --entrypointオプション指定時を除く
  • CMD:実行時の引数により上書き可能

デーモンの起動コマンドが固定であればあまり気にする必要はない。

ただし、起動コマンドを動的にコントロールしたい場合に
以下のように使われることが多い。

  • ENTRYPOINT:実行したいコマンドを記述する
  • CMD:↑のデフォルト引数を定義する
    • CMDは上書き可能なので、実行コマンドの引数を柔軟に変えて実行できる