Dockerファイル:【WORKDIR】の詳細説明
前提
- Dockerの基本コマンド
- Linuxヒアドキュメント使ったdocker buildの実行
WORKDIRの動き
- ディレクトリを作成
- 作成したディレクトリにcd(change directory)
- RUNやCMDなどの実行ディレクトリがWORKDIRになる
- 以降のサンプルコード実行で動作を確認する
サンプルコード
イメージ作成
sudo docker build -t futa-test -<<+
FROM alpine
ENV DIRPATH=/path DIRNAME=test
WORKDIR \$DIRPATH/\$DIRNAME
RUN pwd > dir_name
CMD "sh" "-c" "pwd;ls -l;cat dir_name"
+
> FROM alpine > ENV DIRPATH=/path DIRNAME=test > WORKDIR \$DIRPATH/\$DIRNAME > RUN pwd > dir_name > CMD "sh" "-c" "pwd;ls -l;cat dir_name" > + Sending build context to Docker daemon 2.048kB Step 1/5 : FROM alpine ---> c059bfaa849c Step 2/5 : ENV DIRPATH=/path DIRNAME=test ---> Running in 2866bade3d27 Removing intermediate container 2866bade3d27 ---> 40ddf8071757 Step 3/5 : WORKDIR $DIRPATH/$DIRNAME ---> Running in 6f7db6f3360b Removing intermediate container 6f7db6f3360b ---> 80b1218d51f3 Step 4/5 : RUN pwd > dir_name ---> Running in c7e18ca06db6 Removing intermediate container c7e18ca06db6 ---> d4a1f54324b3 Step 5/5 : CMD "sh" "-c" "pwd;ls -l;cat dir_name" ---> Running in 2aa8228bf165 Removing intermediate container 2aa8228bf165 ---> 92b8a834b5e2 Successfully built 92b8a834b5e2 Successfully tagged futa-test:latest
- docker build
- イメージ作成コマンド
- タグ名「futa-test」で作成
- FROM
- ベースイメージ指定
- alpine(Alpine Linux)を指定
- ENV
- 環境変数設定
- DIRPATHとDIRNAMEの初期値設定
- WORKDIR
- ワークディレクトリ指定
- 環境変数の文字列を使ってディレクトリ名作成
- 作成したディレクトリ名をWORKDIRにする
- RUN
- 以降で説明
- CMD
- 以降で説明
コンテナ実行
sudo docker run --rm futa-test # 作成したイメージを実行
/path/test total 4 -rw-r--r-- 1 root root 11 Feb 19 11:01 dir_name /path/test
- dockr run
- コンテナ実行
- 使用するイメージは前段で作成した「futa-test」
- RUN(イメージ作成の5行目)
- pwd > dir_name
- pwd
- 現在のディレクトリを表示
- WORKDIRになっている想定
- dir_name
- pwdコマンドの結果をリダイレクト(書き込み)
- 「/path/test」になっている想定
- CMD(イメージ作成の6行目)
- “sh" “-c" “pwd;ls -l;cat dir_name"
- sh -c
- 続くコマンドを実行する
- 「;」は続けて実行する記号
- pwd
- カレントディレクトリ表示
- 「/path/test」
- ls -l
- カレントディレクトリのファイル
- RUNコマンドで作成した「dir_name」が存在する
- cat dir_name
- 「dir_name」の中身を表示
- 「/path/test」
- 以降にCMDコマンドの結果考察
CMDコマンドの結果考察
- pwdが「/path/test」
- 今(コンテナ実体化時)いる場所(カレントディレクトリ)
- つまり、WORKDIRに移動している
- ls -lが「dir_name」
- 今いる場所にWORKDIRに作成した「dir_name」がある
- つまり、CMDコマンドがWORKDIRで実行されている
- cat dir_nameが「/path/test」
- RUNで実行したpwdの結果が「/path/test」
- つまり、RUNコマンド実行がWORKDIRで実行された
- 最初に想定したWORKDIRの動きと一致した
参考
掃除も忘れずに・・
- 何度も実行しているとDockerイメージのゴミが溜まるので
- 溜まったゴミの一括削除方法
リファレンス
- Dockerfile reference | Docker Documentation
- DockerファイルのWORKDIRのリファレンス

