Dockerの機能で、ホスト側のフォルダをマウントさせて、共有フォルダとして使用する機能があります。macOS Catalina 10.15以降で、この機能でマウントさせたフォルダにアクセスできないということがありました。
結論を書くと、macOSのプライバシー設定で対象のフォルダがブロックされてしまい、アクセスできなくなっていたということでした。
この記事は、この問題の原因をどのように確認して、解決できたかについてまとめています。
状況
Dockerでnginxをコンテナ化させて、開発用のテストWebサーバーを作っています。その中に配置するファイルは、色々変更を加えたいので、docker-compose.yml
ファイルに次のように記述して、ローカルフォルダをコンテナ内にマウントさせています。
version: "3"
services:
nginx:
build: .
ports:
- 80:80
volumes:
- ./content_home:/usr/share/nginx/html
しかし、実行すると、HTTP Status 404 Not Foundとなってしまい、アクセスできないという状況になってしまいました。
このdocker-compose.yml
ファイルを含めて、関連ファイル一式を一つのフォルダに入れて、他のディレクトリで実行すると、問題なく表示されています。
どこを確認するべきか
このようなときに確認するべき場所は以下の通りです。
/usr/share/nginx/html
は存在しているか?/usr/share/nginx/html
内のファイルは見えるか?- ホスト側の
./content_home
は存在しているか? - ホスト側の
./content_home
のパーミッションなどのアクセス権は、読み取り権限が付与されているか?
コンテナ側の確認
コンテナ側の/usr/share/nginx/html
を確認します。
% docker container exec testserver_nginx_1 ls /usr/share/nginx
html
html
と出力されたので、html
フォルダは存在しています。次にフォルダ内のファイルを確認します。
% docker container exec testserver_nginx_1 ls /usr/share/nginx/html
ls: cannot open directory '/usr/share/nginx/html': Operation not permitted
アクセスが拒否されてしまいました。アクセス権に問題があることが予想されます。
ホスト側の確認
ホスト側のフォルダの存在確認とアクセス権を確認します。Finderで見るのが確認です。Finderでフォルダを選択して、「ファイル」メニューから「情報を見る」を選択します。「共有とアクセス権」を確認します。
「everyone」と「staff」が「読み出しのみ」、「自分」が「読み書き」になっていれば問題ありません。
macOSのプライバシー設定
macOSのプライバシー設定で、以下の3つのフォルダはアプリ毎にアクセス許可を与える必要があります。
- ダウンロード
- 書類
- デスクトップ
アプリをインストールしてから初めて上記のフォルダにアクセスしようとしたときに、OSが許可するかを確認するダイアログを表示します。そこで許可していないとアクセスできません。
確認するには、次のように操作します。
(1) アップルメニューから「システム環境設定…」を選択します。
(2) 「セキュリティとプライバシー」をクリックします。
(3) 「プライバシー」タブを開きます。
(4) 「ファイルとフォルダ」を選択します。
私の環境でアクセス出来なかった原因は、スクリーンキャプチャのように「デスクトップフォルダ」のチェックが外れていたからでした。
今回はたまたま、デスクトップフォルダで作業していました。
覚えてはいませんが、外してしまったようです。