Docker - Dockerfile
ナビゲーションに移動
検索に移動
概要
Dockerfileの基礎
Dockerfileの概要
Dockerfileは、Dockerイメージの設計図のようなものである。
Dockerfileを作成することにより、任意のDockerイメージを作成できる。
DockerfileからDockerイメージを作成するには、Dockerfileが存在するディレクトリで以下のコマンドを実行する。
# イメージ名およびタグ名、Dockerファイル名を指定する場合 sudo docker build -t <イメージ名>:<タグ名> -f <Dockerファイル名> . # イメージ名およびタグ名、Dockerファイル名(Dockerファイル名がdockerfileの場合のみ)は省略できる sudo docker build .
Dockerfileで使用するコマンドを、以下に示す。
- FROM
- RUN
- CMD
- ENTRYPOINT
- COPY
- ADD
- ENV
- WORKDIR
Dockerfileの作成手順
- FROM
- ベースとなるイメージを決定するコマンドである。
- Dockerfileの先頭に記述する。
- FROMの後には、基本的にOSを記述する。
例1. FROM centos7:latest 例2. FROM ruby:2.5
- RUN
- FROMで記述したOSに対応するコマンドを実行するコマンドである。
- RUNごとにLayerが作成される。(Dockerイメージは、レイヤーを積み重ねていくように作成される)
- 以下の例では、Dockerイメージには、centos7のレイヤーにtouch /usr/bin/testのレイヤーが追加作成される。
- (/usr/bin/testファイルを作成するDockerイメージを作成している)
例. FROM centos7:latest RUN ["touch", "/usr/bin/test"]
- 以下の例では、Dockerイメージには、centos7のレイヤーにcurlとnginxという2つのパッケージをインストールするレイヤーが追加作成される。
- (yum updateはインストールするパッケージを新しいものにするために記述して、yum install -yはパッケージをインストールするために記述している)
例. FROM centos7:latest RUN yum update && yum install -y curl nginx
- DockerfileからDockerイメージを1度作成したものはキャッシュされるため、RUNを複数記述することにより、ビルドの時間を短くすることができる。
- ただし、レイヤー数は少ない方が望ましいため、&&や\を使用して、RUNの記述を少なくする。
- CMD
- コンテナの実行コマンドを指定するコマンドである。
- Dockerfileの最後に記述する。
- 以下の例では、DockerfileからDockerイメージを作成、docker runコマンドによりコンテナを作成した後、/bin/bashを実行している。
例. FROM centos7:latest RUN yum update && yum install -y curl nginx CMD ["/bin/bash"]
- ENTRYPOINT
- CMDに近い役割を持つコマンドである。
- CMDは、Dockerコンテナを作成・実行する時(docker runコマンド)、コマンドを上書きできるが、
- (例. docker run lsコマンドを実行する場合、上記のCMDの例ではbashではなく、lsが実行される)
- ENTRYPOINTを使用する場合、コマンドは上書きできなくなり、CMDはENTRYPOINTのオプションを記述する形となる。
- 以下の例では、
ENTRYPOINT
にls
コマンドを記述することにより、コンテナ実行時(docker run
コマンド)に、ls
以外のコマンドが実行できなくなる。 - なお、
CMD
では、--help
オプションを指定している。
例. FROM centos7:latest RUN yum update && yum install -y curl nginx ENTRYPOINT ["ls"] CMD ["--help"]
- COPY
- Dockerfileが存在するディレクトリ(BuildContextという)にあるファイルを、Dockerイメージにコピーするコマンドである。
- DockerfileをビルドしてDockerイメージからコンテナを作成した後、コンテナにNewDirディレクトリを作成して、Test.txtファイルをコピーしている。
- この時、Dockerイメージのレイヤーが追加・作成される。
例. FROM ubuntu:latest RUN mkdir /NewDir COPY Test.txt /NewDir CMD ["/bin/bash"]
- ADD
- COPYのコマンドと似ていて、同じくコピーができるインストラクションです。
- ADDとCOPYとの違い
- ADDは圧縮ファイルをコピーした際、コピーと解凍の両方を行います。
- COPYは単純なコピーのみです。
- 圧縮ファイルをコピー・解凍する時にはADD、圧縮ファイルが関係ない単純なコピーにはCOPYを使います。
- 以下の例では、Dockerfileをbuildした際、DockerImageにsample.tarを/(ルート直下)にコピー・解凍するLayerを作成されます。
- コンテナを作成した際に、コンテナのルート直下にsample.tarが解凍されたものが作成されています。
例. FROM ubuntu:latest ADD sample.tar / CMD ["/bin/bash"]
- ENV
- 環境変数を設定するインストラクションです。
- 以下の例では、コンテナ作成時にkey1=valueという環境変数が設定されるDockerImageが作成されます。
例. FROM ubuntu:latest ENV key1 value CMD ["/bin/bash"]
- WORKDIR
- インストラクションの実行ディレクトリを変更するインストラクションです。
- 以下の例では、sample_folderというディレクトリを作り、sample_folder内でsample_fileを作成するLayerとなります。
- (WORKDIRを使ったことで、コンテナ内に作成した/sample_folderの中でRUNの実行ができます。)
例. FROM ubuntu:latest RUN mkdir sample_folder WORKDIR /sample_folder RUN touch sample_file