簡體   English   中英

在Docker容器內運行`mkdir`時權限被拒絕

[英]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鏡像DockerfileVOLUME聲明:

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 ,常見的修復方法是:

  • 重新啟動docker服務
  • 運行docker-compose as sudo

我能夠做到這一點:

  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM