Dockerでコンテナに、ホスト側のフォルダをマウントさせて、共有フォルダとして使う機能があります。この機能でマウントさせるフォルダにアクセスできないときのチェック箇所についてです。
この記事の動作環境はホストOSはmacOS Catalina 10.15です。
macOSをホストにしているときは、プライバシー設定も確認が必要だったことを記事にしました。
状況
Dockerでnginxをコンテナ化させて、開発用のテストWebサーバーを作っています。その中に配置するファイルは、色々変更を加えたいので、Docker Composeの設定ファイルを次のようにして、ローカルのフォルダをマウントさせています。
version: "3"
services:
nginx:
build: .
ports:
- 80:80
volumes:
- ./content_home:/usr/share/nginx/html
しかし、走らせてみると、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が許可するかを確認するダイアログを表示します。そこで許可していないとアクセスできません。
確認するには、次のように操作します。
- アップルメニューから「システム環境設定」を選択する。
- 「セキュリティとプライバシー」をクリックする。
- 「プライバシー」タブを選択する。
- 「ファイルとフォルダ」を選択する。

スクリーンキャプチャの通りデスクトップフォルダのチェックが外れていました。
今回はたまたま、デスクトップフォルダで作業していました。
覚えてはいないですが、外していたようです。