##背景
Docker × Laravel で開発を行おうとしたところ、dockerコンテナ内でlaravelのアプリケーションディレクトリに対するあらゆるコマンドがOperation not permittedで使えない状況になった。
構成としては以下の形。app/がlaravelのファイル群が入ったディレクトリで、これをvolumeでマウントしている。
┏ docker-composer.yml
┣ docker/
┃ ┗ Dockerfile
┗ app/
┣ app/
┣ bootstrap/
┣ config/
:
version: '3'
volumes:
mysql-volume:
services:
app:
build: ./docker
ports:
- 80:80
volumes:
- ./app:/var/www/app
working_dir: /var/www/app
db:
image: mysql:8.0
ports:
- 3306:3306
environment:
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: pass
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- mysql-volume:/var/lib/mysql
Operation not permitted
コンテナを立ち上げてbashで中に入ってみると、appディレクトリにおいてlsコマンド、composerなどあらゆる操作ができない。
$ docker-compose up -d
Starting application_app_1 ... done
Starting application_db_1 ... done
$ docker-compose exec app bash
root@dd0e1979fc6b:/var/www/app# ls
ls: reading directory '.': Operation not permitted
root@dd0e1979fc6b:/var/www/app# composer install
[ErrorException]
file_get_contents(./composer.json): Failed to open stream: Operation not permitted
別のディレクトリではlsコマンドを実行することができる。
ディレクトリやファイルの権限がないのかと思ったが、読み取りや実行権限もありそう。
なぜかappディレクトリだけ制限がかかっている状態。
root@dd0e1979fc6b:/var/www/app# cd ..
root@dd0e1979fc6b:/var/www# ls -l
total 4
drwxr-xr-x 27 root root 864 Nov 12 05:10 app
drwxrwxrwx 1 www-data www-data 4096 Oct 12 04:45 html
ここで、githubにある同じファイル群を別の方にcloneしてもらい、同じ操作をしてもらったところ、普通にlsやcomposerを使うことができていた。
よって、自分のPCの何らかの設定が怪しいと思われた・・・。
##原因と対応
これは、Docker for Mac側でデスクトップへのアクセスが許可されていないことが原因だった。
docker-composer.ymlでマウントしているホスト側の./appがDesktop下にあったため、docker for macが参照できなかったっぽい。
macのシステム環境設定 > セキュリティとプライバシーから、「プライバシー」タブへ移動する。
このDockerの "デスクトップ"フォルダのチェックマークをつけて、保存する。
root@3e4c6b151144:/var/www/app# ls
CHANGELOG.md app bootstrap composer.lock database phpunit.xml resources server.php tests webpack.mix.js
README.md artisan composer.json config package.json public routes storage vendor
root@3e4c6b151144:/var/www/app# composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 111 installs, 0 updates, 0 removals
Failed to download doctrine/inflector from dist: The zip extension and unzip/7z commands are both missing, skipping.
...
appディレクトリで操作ができるようになりました。