Ryu's blog

ゆるくアウトプットしていきたい

Dockerfileの書き方まとめ

 いままでDockerを使用したことなかったのですが、最近Dockerを使う機会がありDockerを使用して開発環境を構築したりしたのですが、Dockerはとても便利ですね! そのDockerのインフラの構成をコードで行えるDockerfileの基本的な書き方をまとめておきたいと思います。

Dockerfileの基本構文一覧

Dockerfileを作成するときに用いる命令文の一覧が下記になります。
公式ドキュメント

  • FROM : ベースイメージの指定
  • RUN : コマンド実行
  • CMD : デーモン実行
  • LABEL : ラベルの設定
  • EXPOSE : ポートのエクスポート
  • ENV : 環境変数の設定
  • ADD : ファイル / ディレクトリの追加
  • COPY : ファイルのコピー
  • VOLUME : ボリュームのマウント
  • ENTRYPOINT : デーモン実行
  • USER : ユーザーの指定
  • WORKDIR : 作業ディレクトリの指定
  • ONBUILD : ビルド完了後に実行される命令

それぞれのコマンドについて以下に簡単に書いておきます。

Dockerfileコマンドの詳細

  • FROM : ベースイメージの指定
    FROM {イメージ}:{タグ}FROM {イメージ}@{ダイジェスト}
    Dockerでビルドするベースイメージを指定することができます。 (例)FROM ubuntu:18.04(タグなどを指定しなければ最新のもの)

  • RUN : コマンド実行
    RUN {実行するコマンド} Dockerイメージを生成するときに実行されます。主に、ソフトウェアなどのインストールなどを行います Shell形式とExec形式の2通りの書き方があります。 (例)Shell形式 RUN sudo apt-get install apache(シェルで実行)
       Exec形式 RUN ["/bin/bash", "echo 'Hello World!'"]
       (直接実行します。環境変数などは利用不可。JSON配列)
    この2通りの書き方は他のコマンドにも適用可能

  • CMD : デーモン実行
    CMD {実行するコマンド}
    CMDはFROMコマンドのイメージで生成したコンテナ内でコマンドを実行します。Dockerfileには1つのCMDのみ記述可能。複数指定した場合は、最後のCMDを実行します。
    (例)CMD exec program1
    docker runコマンドの実行時にコマンドを指定された場合、それが優先されます。

  • LABEL : ラベルの設定
    LABEL {key}={value} {key}={value} ...
    イメージのラベル情報の設定を行います。
    (例)LABEL version="1.0"

  • EXPOSE : ポートのエクスポート
    EXPOSE {port number}
    コンテナの公開するポート番号を指定できます。
    (例)EXPOSE 80/tcp

  • ENV : 環境変数の設定
    ENV {key} {value}ENV {key}={value} ...
    コンテナ内での環境変数の設定が可能。
    (例)ENV name Ryu

  • WORKDIR : 作業ディレクトリの指定
    WORKDIR {作業用ディレクトリのパス}
    RUNやCMDコマンドで指定したコマンドを実行するディレクトリを指定します。ENVコマンドで指定した環境変数の使用も可能。
    (例)WORKDIR /home/work

ENV DIRPATH /home   
WORKDIR $DIRPATH/sample
  • ADD : ファイル / ディレクトリの追加
    ADD {ファイルのパス} {Docker内のファイルのパス}
    ADD ["{ファイルのパス}" "{Docker内のファイルのパス}"]
    Dockerイメージ内にホストのファイルやディレクトリの追加します。
    (例)ADD index.html /home/sample/
       ADD index.html sample(WORKDIR/sampleとなります。)

  • COPY : ファイルのコピー
    COPY {ファイルのパス} {Docker内のファイルのパス}
    COPY ["{ファイルのパス}" "{Docker内のファイルのパス}"]
    Dockerイメージ内にホストのファイルやディレクトリをコピーします。
    (例)COPY index.html /home/sample/
       COPY index.html sample(WORKDIR/sampleとなります。)

  • VOLUME : ボリュームのマウント
    VOLUME ["{マウントするパス}"]
    Dockerイメージのボリュームのマウントする場所を割り当てます。(JSON配列)
    (例)VOLUME ["/data"]

  • ENTRYPOINT : デーモン実行
    ENTRYPOINT {実行するコマンド}
    ENTRYPOINT ["{実行するコマンド}"]
    docker runコマンドが実行されるときに実行されます。
    (例)ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

  • USER : ユーザーの指定
    USER {user名 / UID}
    Dockerイメージの実行をするユーザーを指定します。
    (例)USER Ryu

  • ONBUILD : ビルド完了後に実行される命令
    ONBUILD {実行するコマンド} Dockerのイメージをビルドするときに実行されます。Dockerfileのイメージをベースイメージとして、他のイメージをビルドスするときに役立ちます。
    (例)ONBUILD ADD . /app/src
       ONBUILD RUN /usr/local/bin/python-build --dir /app/src

Dockerfileをどこに置くべきか

 Dockerfileをdocker buildすると、DockerfileがあるディレクトリやサブディレクトリをDocker daemonに送ります。したがって、ルートディレクトリなどにおいてしまうとすべてのコンテンツを送ってしまいます。

 なので、必要ないファイルはDockerfileと同じディレクトリに置かないようにしたり、.dockerignoreファイルを作成したりする。もしくは、空のディレクトリなどを作成し、そのディレクトリ内に置いたりするのが良いみたいです。