Dockerイメージを作るためには、必要なミドルウェアをインストールし、ユーザーアカウントやディレクトリを作成するなどのコマンドを実行する必要があります。
また、イメージからコンテナを生成した時に、サーバプロセスなどをデーモンとして動かす必要もあります。
この記事では、Dockerfileでコマンドやデーモンを実行する方法について説明します。
コマンドの実行(RUN命令)
コンテナにはFROM命令で指定したベースイメージに対して、「アプリケーション/ミドルウェアをインストール/設定する」「環境構築のためのコマンドを実行する」など、なんらかのコマンドを実行するときには、RUN命令を使います。
このRUN命令は、Dockerfileの作成では、最も多く使います。
RUN命令で指定したコマンドはDockerイメージを生成するときに実行されます。
RUN [実行したいコマンド]
RUN命令は、次の2通りの記述の仕方があります。
1. Shell形式での記述
コマンドの指定をシェル(コンピュータに命令を実行させるためのプログラム)で実行する形式を使って記述する方法です。例えば、aptコマンドを使ってNginxをインストールするときは、以下のようになります。
# Nginxのインストール
RUN apt-get install -y nginx
これは、Dockerコンテナ内で/bin/sh -c(UNIX系のOS(LinuxやMac)のsh
シェル)を使ってコマンドを実行したときと同じ動作をします。Dockerコンテナで実行するデフォルトのシェルを変更したいときはSHELL命令を使います。
2. Exec形式での記述
Shell形式でコマンドを記述すると、/bin/shで実行されますが、Exec形式で記述すると、シェルを介さず直接実行します。そのため、コマンド引数に$HOMEのような環境変数を指定できません。Exec形式では、実行したいコマンドをJSON配列で指定します。
また、別のシェルを利用したいときなどはRUN命令にシェルのパスを指定して、実行したいコマンドを指定します。たとえば/bin/bash(UNIX系のOS(LinuxやMac)のbash
シェル)で、aptコマンドを使ってNginxをインストールするときは以下のようになります。
(ここで、-c
は渡された文字列をコマンドとして認識して実行するためのオプションです。)
# Nginxのインストール
RUN ["/bin/bash","-c","apt-get install -y nginx"]
/bin/shを介してコマンドを実行したいときはShell形式で記述し、それ以外はExec形式で記述するとよいでしょう。
デーモンの実行(CMD命令)
RUN命令はイメージを作成するために実行するコマンドを記述しますが、イメージをもとに生成したコンテナ内でコマンドを実行するには、CMD命令を記述することができます。もし複数指定したときは、最後のコマンドのみが有効になります。
たとえば、Webサーバを稼働させるために、NginxをインストールするコマンドはRUN命令で、インストールしたNginxをデーモンとしてコンテナ内で常時稼働させるためにはCMD命令を使います。
(デーモンとは、Unix系のマルチタスクオペレーティングシステム において動作するプロセスで、主にバックグラウンドで動作するプロセスのことです。)
CMD [実行したいコマンド]
CMD命令は以下の方法の記述の仕方があります。
1. Exec形式での記述
RUN命令での構文と同様になります。Exec形式はシェルを呼び出しません。引数はJSON配列で指定します。
CMD ["nginx", "-g", "deamon off;"]
2. Shell形式での記述
RUN命令での構文と同様になります。シェルを介して実行したいときに使います。
(ここで、-g
は指定したglobalディレクティヴの設定でnginxを起動するオプション。daemon off
はバックグラウンドではなくフォアグラウンドで動かすためのオプションです。
nginxのコマンドのオプションについては、公式のドキュメントを参照してください。)
CMD nginx -g 'daemon off;'
この記事では、Dockerfileでミドルウェアをインストールコマンドやコンテナ内でデーモンを実行する方法を説明しました。
次の記事ではDockerfileでネットワークや環境変数を設定する方法を説明します。