Dockerfileとは
Dockerでイメージをビルドするにはコンテナの構成情報を記述されたファイルが必要です。 そのファイルをDockerfileと呼びます。 Dockerイメージを作成するにはコマンドラインからも作成可能ですが、Dockerfileで設定をコードとして明示的に示すことで、変更などを可能にします。
(Dockerをインストールする 【MacOS】こちらで紹介している環境構築ではコマンドラインから作成しています。)
Dockerfileを作成することで以下のことをビルド時に実行することができます。
- Dockerのイメージの作成
- Docker上で行うコマンド操作
- 環境変数の設定
- Dockerコンテナ上で動作させるためのデーモン実行
Dockerfileの書き方
DockerFileにはDocker特有の書き方があります。 「命令コード 引数」という書式で1行に付き1つの操作を書いていきます。 よく使われる命令コードは以下の通りです。
FROM | イメージの指定 |
USER | ユーザーの指定 |
WORKDIR | 作業ディレクトリの指定 |
RUN | コマンドの命令 |
VOLUME | ボリュームのマウント |
ADD | ファイル及びディレクトリの追加 |
ENV | 環境変数の設定 |
EXPOSE | ポートのエクスポート |
CMD | デーモン実行 |
Python開発環境構築してみよう
Dockerfileを実際に書いていきながらDockerでPythonの開発環境構築してみます。
準備
ディレクトリの準備をします。
$ mkdir docker-sample $ cd docker-sample $ touch Dockerfile
docker-sampleというディレクトリにDockerfileが作成されました。
Dockerfileの書き込み
$ vi Dockerfile
FROM python:3.6 USER root WORKDIR /home/username RUN apt-get update RUN apt-get install -y vim RUN pip install requests==2.18.4 click==6.7 ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8
FROMでどのDockerイメージからコンテナを生成するか記述 使用できるコンテナイメージはDockerHubから確認します。 pythonで検索をかけると、様々なタグ(バージョン)が出てくるので選択します。 今回はpython3.6をインストールしました。
USERで各種命令実行時のユーザーを指定
WORKDIRで各種命令実行時のカレントディレクトリを指定
RUNでコマンド実行 「apt-get update」パッケージリストの更新 「apt-get install -y vim」vimのインストール 「pip install requests==2.18.4 click==6.7」 Requests ライブラリをインストール
ENVで日本語の設定
ではこのDockerfileをもとにイメージを作ってみます。
$ docker build -t pytest . Sending build context to Docker daemon 2.048kB Step 1/1 : FROM python:3.6 3.6: Pulling from library/python . . . . . Status: Downloaded newer image for python:3.6 ---> Successfully built a2e9f0fba405 Successfully tagged pytest:latest
docker build -t [イメージ名] [Dockerfileのパス]
docker buildコマンドでDockerfileの上から順番に処理が実行されていきます。 今回のように作成したDockerfileと同じディレクトリにいる状態でビルドするときはパスは”.”で大丈夫です。
確認してみます。
$ docker images pytest latest a2e9f0fba405 2 weeks ago 913MB
Dockerfileをもとにイメージが作成されています。
コンテナに接続してみます。
$ docker run -it pytest /bin/bash root@48af0a1cef7f:/# python --version Python 3.6.9
pythonがインストールされていることが確認できました。
python実行確認のために現在の日時を表示してみましょう。
# vim sample.py
sample.py
import datetime tm_now = datetime.datetime.now() print(tm_now.strftime('%Y年%m月%d日 %H:%M:%S'))
# python sample.py 2019年11月06日 06:19:45
OKですね!