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