[英]Permission denied when running `mkdir` inside of a Docker container
我使用Docker Compose運行幾個容器,包括一個帶Postgres圖像的容器。 我正在嘗試向該容器添加一個卷,以便在容器構建中保留我的數據。 但是,當它嘗試在容器中為此卷創建目錄時,我收到錯誤。
我跑:
docker-compose build
然后
docker-compose up
我收到以下錯誤:
錯誤:對於cxbenchmark_db_1無法啟動服務db:oci運行時錯誤:container_linux.go:265:啟動容器進程導致“process_linux.go:368:容器init導致”rootfs_linux.go:57:mount \\\\“/ var / lib /泊塢窗/卷/ 69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e / _data \\\\ “來根文件系統\\\\ ”的/ var / lib中/泊塢窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合並\\\\“ 在\\\\” 的/ var / lib中/泊塢窗/ overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 /合並的/ var / lib中/ postgresql / data \\\\“cause \\\\”mkdir / var / lib / docker / overlay2 / 627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355 / merged / var / lib / postgresql / data:permission denied \\\\“\\”“
我的完整docker-compose.yml
看起來像這樣(注意名為db
的服務,其中定義了卷):
version: '3'
services:
nginx:
image: nginx:latest
ports:
- 80:8000
volumes:
- ./src:/src
- ./config/nginx:/etc/nginx/conf.d
- ./src/static:/static
depends_on:
- web
web:
build: .
command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn cx_benchmark.wsgi -b 0.0.0.0:8000"
depends_on:
- db
volumes:
- ./src:/src
- ./src/static:/static
expose:
- 8000
db:
image: postgres:latest
volumes:
- /private/var/lib/postgresql:/var/lib/postgresql
ports:
- 5432:5432
有關如何解決的任何想法?
你看到的錯誤不一定是你的compose
文件中顯式卷綁定掛載的問題,而是主postgres
官方Docker鏡像Dockerfile
的VOLUME
聲明:
VOLUME /var/lib/postgresql/data
由於您尚未為此目錄(而是父目錄)提供掛載點,因此docker引擎正在創建本地卷,然后嘗試將該卷裝入已綁定裝入的位置並獲取權限錯誤。
為清楚起見,這是docker引擎為您創建的卷:
/var/lib/docker/volumes/69845a017b4465e9122852a75ca194db473df95fa218658b8a60fb56eba9be9e/_data
這是目錄位置,它嘗試綁定mount dir; 在/private/var/lib/postgresql
bind掛載之上:
mkdir /var/lib/docker/overlay2/627956d63fb0480448079577a83b0b54f83866fdf31136b7c669541c3f672355/merged/var/lib/postgresql/data: permission denied
現在,我認為失敗的原因是你可能在Docker引擎中打開了用戶命名空間(“ userns-remap
”標志/設置),這樣容器就沒有權限在root擁有的內創建一個目錄在您的主機上的位置。 除此之外,唯一的另一個選擇是postgres
容器以非root用戶身份啟動,但我沒有在compose文件或使用USER
指令的最新版本的官方Dockerfile
看到任何內容。
Dockerfile
,由於你的綁定掛載與postgres Dockerfile
中的VOLUME
說明符不匹配,因此你最終會出現雙卷,你可以將你的compose文件更改為掛載到/var/lib/postgresql/data
並繞過那個正在創建額外的卷。 特別是如果您希望您的數據庫數據最終在/private/var/lib/postgresql
,因為它可能會令人驚訝地發現它不在那里,而是在/var/lib/docker/volumes/..
位置。
基於https://github.com/docker/compose/issues/4039 ,常見的修復方法是:
我能夠做到這一點:
sudo mkdir /private/lib/postgresql
docker-compose up
使用以下docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:latest
ports:
- 80:8000
db:
image: postgres:latest
volumes:
- /private/var/lib/postgresql:/var/lib/postgresql
ports:
- 5432:5432
對不起,我沒有得到更多的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.