【Docker】DockerfileのWORKDIRとは?
ネット上のDockerfileを見るとよく
FROM python:latest
WORKDIR mydir
のように書いてあるのをみると思います。
この
WORKDIR
とは何でしょうか?
一言で言えば「作業用ディレクトリ」になります。
ビルド後に中に入って色々ファイルを置いたりの作業をする場所です。
正直書かなくても別に問題はないですが
書いておいた方が、後々の可読性が上がります。
別の人が書いたDockerで作業する時、「WORKDIR」が書いてあると、中に入ってからとりあえずその場所にアクセスすれば、作業しやすくなります。
では実際にテストしてみましょう。
練習用にこんな簡単なDockerを作ります。
●ディレクトリ構成
test_workdir
– docker-composer.yml
– Dockerfile

docker-compose.yml
services:
web:
build: .
tty: true
Dockerfile
FROM almalinux
WORKDIR /cat
死ぬほど簡単ですねw
ではビルドします。
docker-compose up -d --build
[+] Building 0.5s (8/8) FINISHED
=> [internal] load local bake definitions 0.0s
=> => reading from stdin 380B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 67B 0.0s
=> [internal] load metadata for docker.io/library/almalinux:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/2] FROM docker.io/library/almalinux:latest@sha256:b744654d6126b97fd50feccb6295d339663984ab0539c8dca147e220610e9d09 0.0s
=> => resolve docker.io/library/almalinux:latest@sha256:b744654d6126b97fd50feccb6295d339663984ab0539c8dca147e220610e9d09 0.0s
=> [2/2] WORKDIR /cat 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => exporting manifest sha256:4cb18dd38e6cb9b7fdd22048b299cc7a3003080b2eb0f86dfcd9d224227a938b 0.0s
=> => exporting config sha256:25764ed7b9e82e79031db2c82f8869c350986d77f9b5e5dc465cb87ab421b050 0.0s
=> => exporting attestation manifest sha256:4715afe1247e5a6ad424e3ba058eff04ab0ec883ac2d93ba3385824870a59310 0.0s
=> => exporting manifest list sha256:390bbbccf69bb4e20ce851d143e7b9ac81fd364d529219f7f20a7706f670d144 0.0s
=> => naming to docker.io/library/test_workdir-web:latest 0.0s
=> => unpacking to docker.io/library/test_workdir-web:latest 0.0s
=> resolving provenance for metadata file 0.0s
[+] Running 3/3
✔ web Built 0.0s
✔ Network test_workdir_default Created 0.0s
✔ Container test_workdir-web-1 Started
ビルド成功
中に入ってみます。
docker-compose exec -it web bash
[root@522e9921428e cat]#
[root@522e9921428e cat]# pwd
/cat
[root@522e9921428e cat]#
rootで中に入ると普通はトップディレクトリにいますが「/」
今は「/cat」にいるようです。
構成見てみましょう。
[root@522e9921428e cat]# ls -la /
total 60
drwxr-xr-x 1 root root 4096 Nov 27 23:23 .
drwxr-xr-x 1 root root 4096 Nov 27 23:23 ..
-rwxr-xr-x 1 root root 0 Nov 27 23:23 .dockerenv
dr-xr-xr-x 2 root root 4096 Oct 2 2024 afs
lrwxrwxrwx 1 root root 7 Oct 2 2024 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Nov 27 23:21 cat
drwxr-xr-x 5 root root 360 Nov 27 23:23 dev
drwxr-xr-x 1 root root 4096 Nov 27 23:23 etc
drwxr-xr-x 2 root root 4096 Oct 2 2024 home
lrwxrwxrwx 1 root root 7 Oct 2 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Oct 2 2024 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Oct 2 2024 media
drwxr-xr-x 2 root root 4096 Oct 2 2024 mnt
drwxr-xr-x 2 root root 4096 Oct 2 2024 opt
dr-xr-xr-x 203 root root 0 Nov 27 23:23 proc
dr-xr-x--- 2 root root 4096 Jul 12 14:19 root
drwxr-xr-x 13 root root 4096 Jul 12 14:19 run
lrwxrwxrwx 1 root root 8 Oct 2 2024 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Oct 2 2024 srv
dr-xr-xr-x 11 root root 0 Nov 27 23:23 sys
drwxrwxrwt 2 root root 4096 Oct 2 2024 tmp
drwxr-xr-x 12 root root 4096 Jul 12 14:18 usr
drwxr-xr-x 18 root root 4096 Jul 12 14:18 var
普通あるはずのない「cat」ディレクトリが出来ているのがわかります。
ビルド時に置きたいファイルがあったりしたら、ここに置けばいいし
サーバー内のファイル移動しての作業もここでやればいい
どこで何したのか後々わかりやすくなります。
ここで1点注意があります。
WORKDIRすると、その後の命令は全てWORKDIR内で実行されます。
どうゆう意味でしょう?
試しによく使うCOPYコマンドでやってみましょう。

中は空っぽの「test.txt」ファイルを置きます。
これをDockerfileでCOPYしてみます。
FROM almalinux
WORKDIR /cat
COPY ./test.txt ./
これで中に入ってみると
docker-compose exec -it web bash
[root@8cd702c3db0b cat]# ls
test.txt
当然と言えば当然ですが、COPYしたファイルの置き場を「./」に指定すると
/cat/test.txt
に置かれます。
WORKDIRの使い方としては、「WORKDIR」を書いた後の命令は全て「WORKDIR」を起点に動きます。
例えばfile群を全てサーバー内に置いてビルドしたい時

「files」フォルダ内のファイルを全てサーバーに上げたい時
Dockerfileを以下のように書きます。
FROM almalinux
WORKDIR /cat
COPY ./files/ ./
ビルドしてみます
docker-compose up -d --build
docker-compose exec -it web bash
ls /cat
test.txt test_b.txt test_c.txt
WORKDIRで指定した「/cat」内にCOPYしたファイルが一括で上がっています。
WORKDIRを指定した後の命令は全て「WORKDIR」内で作業が行われるという仕様を活かせば、色々作業がしやすくなります。
-0 Comment-