Dockerfileとは
Dockerfileは、Dockerイメージを作成するためのテキストファイル
以下の情報が記述される
- 基本となるOS
- インストールする必要があるソフトウェア
- コピーするファイル・ディレクトリ
- 実行するコマンド
#### ベースとなるイメージを指定
FROM python:3.7-alpine
#### 作業ディレクトリを指定
WORKDIR /app
# /app ディレクトリを作業ディレクトリに指定
# 存在しない場合でも自動的に作成される
#### ローカルファイルをDockerイメージにコピー
COPY ./src/ /app/
# ローカルのsrcディレクトリをコンテナの/appディレクトリにコピー
# srcディレクトリ内のすべてのファイルが/appに入る
#### 必要なパッケージをインストール
RUN apk update && apk add --no-cache python3 gcc musl-dev libc-dev
# Alpineベースのイメージでパッケージリストを更新し、Python3関連のツールと依存関係をインストール
#### Pythonの依存パッケージをインストール
COPY requirements.txt /app/
RUN pip3 install --no-cache-dir -r requirements.txt
# requirements.txtに記載されたPythonの依存パッケージをインストール
#### ENTRYPOINT命令でコンテナ起動時に実行されるコマンドを指定
ENTRYPOINT ["python3", "app.py"]
# コンテナ起動時に必ず "python3 app.py" が実行されるように指定
FROM
作成するコンテナのベースとなるイメージを指定
FROM ubuntu:18.04
と記述すると、Ubuntu 18.04をベースにしたイメージが作成
コロンの後にタグを指定
タグなしの場合、latest(最新)が選択される
FROM イメージ[:タグ]
# example
FROM python:3.7-alpine
WORKDIR
コマンドを実行する作業ディレクトリを指定
WORKDIR /app
と記述すると、その後のRUN、CMD、ENTRYPOINT、COPY、ADD命令が/appディレクトリで実行される
※ディレクトリが存在しない場合:
指定したディレクトリがイメージ内に存在しない場合でも、自動的にそのディレクトリが作成されます。たとえば、以下のように /app/mydir がまだ存在しない場合でも、自動的に作成されます。
WORKDIR /app/mydir
※Dockerfile に WORKDIR が存在しない場合、
ルートディレクトリ(/)に自動で作成されます。
COPY
ソースコードや設定ファイルをローカルからDockerイメージにコピーする
COPY index.html /mydir/index.html
と記述すると、ローカルのindex.html
がイメージ(コンテナ)の/mydir/index.html
にコピーされる
COPY <コピー元ファイル名(orディレクトリ名)> <コピー先ディレクトリ名>
# example
COPY ../web/src/index.html /var/www/
COPY ../web/script/ /var/www/script/
COPY *.txt /var/www/docs/
よく使われる「.」について
## . は 現在のローカルディレクトリ を指します(Dockerfileが置かれているディレクトリ)
# DockerFileの置いてあるフォルダの内容を全ての内容をappディレクトリにコピー
COPY . /app
# ローカルディレクトリのすべての内容を、
# コンテナのカレントディレクトリ(WORKDIRで指定された場所)にコピー
COPY . .
例:
COPY . /app
もしローカルのproject/
ディレクトリに以下のファイルがあるとします:
Dockerfileは/home/user/project/
にある状態。
/home/user/project/
├── Dockerfile
├── app.py
└── requirements.txt
この命令により、コンテナ内に/app
フォルダが作成され、その中にapp.py
とrequirements.txt
がコピーされます。
RUN
イメージ作成時に実行するコマンドを指定します。例えば、RUN apt-get update && apt-get install -y git
と記述すると、イメージ作成時にパッケージリストの更新とgitのインストールが行われます
ENTRYPOINT
コンテナ起動時に実行するコマンドとオプションを変更できる
原則は末尾に記載する
コンテナを実行したときに”必ず”実行されるコマンド
# コンテナ起動時に必ず "ping 127.0.0.1 -c 100" コマンドが実行される
# "ping" コマンドはネットワーク接続のテストに使用
# "127.0.0.1" はlocalhostを指すIPアドレス
# "-c 100" はパケットを100回送信することを指定している
ENTRYPOINT ["ping", "127.0.0.1", "-c", "100"]
# このコンテナは、起動すると 127.0.0.1 に対して 100 回の ping を実行し、その後終了します。
CMD
起動時に実行するコマンド
1つのDockerfileで1度だけ指定できる
CMD <コマンド>
# example
CMD python -m http.server 80
ENV
環境変数の定義
ENV <環境変数名>=<値>
# example
ENV TZ=Asia/Tokyo
# イコールの代わりに半角スペースでもOK
ENV DB_ENDPOINT 172.16.0.2