Dockerファイル:【WORKDIR】の詳細説明


前提

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イメージのゴミが溜まるので
  • 溜まったゴミの一括削除方法

リファレンス


Posted by futa