概要
Apple SiliconのMacでRancher Desktopを使用して、Docker ComposeでPostgreSQLのコンテナを起動することを想定しています。
そのときに、Permission deniedにより起動しない問題が発生しました。調べてみると、Rancher DesktopのmountTypeを9pに設定すると、解決すると情報がありました。しかし、それでも解決せず他の解決方法を見つけたため、共有します。
環境
MacにRancher Desktopをインストールしています。
docker composeでserverとDBのコンテナを起動するというよくある構成です。
/db/dataをマウントしてDBのデータを保存しています。
services:
server:
build:
context: ./server
dockerfile: Dockerfile
container_name: server_test
ports:
- 8000:80
tty: true
volumes:
- ./server/src:/src
depends_on:
db:
condition: service_healthy
env_file:
- .env
db:
container_name: db_test
build:
dockerfile: ./db/Dockerfile
ports:
- 5433:5432
volumes:
- ./db/init:/docker-entrypoint-initdb.d
- ./db/data:/var/lib/postgresql/data
tty: true
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DATABASE=postgres
- DATABASE_HOST=localhost
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 1s
timeout: 5s
retries: 10
FROM postgres:14.0
エラー内容
以下を実行して、コンテナをビルド、起動します。
docker compose build
docker compose up
コンテナを起動すると、以下のようなPermission deniedというエラーが出ます。
db_test | chown: changing ownership of '/var/lib/postgresql/data/base/1/2836': Permission denied
db_test | chown: changing ownership of '/var/lib/postgresql/data/base/1/2663': Permission denied
Gracefully stopping... (press Ctrl+C again to force)
dependency failed to start: container db_test exited (1)
そこで、以下の記事を参考にoverride.yamlを書いて、mountTypeを9pに変更しました。
しかし、DBコンテナがhealth状態にいつまで経ってもなりません。
docker compose up
[+] Running 1/0
✔ Container db_test Created 0.0s
Attaching to db_test, SQL_injection_server
db_test |
db_test | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_test |
db_test | 2024-09-18 06:27:33.158 UTC [1] LOG: starting PostgreSQL 14.0 (Debian 14.0-1.pgdg110+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
db_test | 2024-09-18 06:27:33.159 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db_test | 2024-09-18 06:27:33.159 UTC [1] LOG: listening on IPv6 address "::", port 5432
db_test | 2024-09-18 06:27:33.168 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Gracefully stopping... (press Ctrl+C again to force)
dependency failed to start: container db_test is unhealthy
depends_on
オプションを削除してDBの状態を待機せずに起動しても、DBに正常にアクセスすることができません
解決方法
Rancher Desktopの設定で仮想マシンのエミュレーションとボリュームのマウント方式を変更すると、問題が解決しました。
- override.yamlでmountTypeを9pに設定している人はoverride.yamlを削除します
- Rancher Desktopを開いて、Preferences > Emulation > Virtual Machine > EmulationのVirtual Machine TypeをVZに変更します
- Preferences > Virtual Machine > Emulation > VolumesのMount Typeをvirtiosに変更します