目次

2022.03.16 Docker compose Permission denied

Docker composeでvoluemsを設定したとき、Permission deniedでアクセスできない場合がある。

docker-compose.yml

---
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./public:/usr/share/nginx/html

Permission denied

コンテナにログインして見ると対象にPermission deniedでアクセスできない。
もしファイルを直接指定しても、ハテナになってしまいます。

# docker exec -it app-nginx-1 bash
root@a107d04ed12b:/# ls -al /usr/share/nginx/html/
ls: cannot open directory '/usr/share/nginx/html/': Permission denied

root@a107d04ed12b:/# ls /usr/share/nginx/html/ -al
ls: cannot access '/usr/share/nginx/html/index.html': Permission denied
total 4
drwxr-xr-x. 2 root root  40 Mar  1 13:59 .
drwxr-xr-x. 3 root root  18 Mar  1 13:59 ..
-rw-r--r--. 1 root root 497 Jan 25 15:03 50x.html
-?????????? ? ?    ?      ?            ? index.html

対応

1. SElinuxを止める

setenforce 0

2. zを付ける

  volumes:
    - ./public:/usr/share/nginx/html:z

Docker マニュアル抜粋

SELinux のようなラベリング・システムでは、コンテナ内にマウントされたボリュームの内容に対しても、適切なラベル付けが行われます。
ラベルがなければ、コンテナの中の内容物を使って実行しようとしても、セキュリティ・システムがプロセスの実行を妨げるでしょう。
標準では、Docker は OS によって設定されるラベルに対して変更を加えません。

コンテナの内容物に対するラベルを変更するには、ボリュームのマウントにあたり、:z または :Z を末尾に付けられます(接尾辞)。
これらの指定をすると、Docker に対して共有ボリュームが再度ラベル付けされたものと伝えます。