簡體   English   中英

我如何保證 docker 主機卷在多次 docker-compose up 和 docker-compose-down 之后有正確的權限

[英]how can i guarantee docker host volume have the right permission after multiple `docker-compose up` & `docker-compose-down`

我正在開發一個使用 Postgres 作為其數據庫的 Node.js 應用程序。 我為 Node.js 和 Postgres 編寫了一個“docker-compose.yml”文件。

我創建 pgdata 目錄,然后我編寫 Dockerfile 來構建 Node.js 圖像:

FROM node:14.15.0

WORKDIR "/usr/src/app"

CMD [ "npm", "start" ]

這就是我編寫“docker-compose.yml”文件的方式:

version: "3.7"
services:
  db:
    image: postgres:13
    env_file:
      - ./.env.postgres
    volumes:
      - type: bind
        source: ./pgdata
        target: /var/lib/postgresql/data
        volume:
          nocopy: true
    environment:
      PGDATA: /var/lib/postgresql/data/pgdata
    container_name: ${APP_NAME}-db

  express-app:
    image: ${APP_NAME}-express-app:1
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - type: bind
        source: .
        target: /usr/src/app
        volume:
          nocopy: true
    env_file:
      - ./.env
      - ./.env.postgres
    depends_on:
      - db
    ports:
      - "${APP_PORT}:${DOCKER_CONTAINER_APP_PORT}"
    environment:
      POSTGRES_HOST: db

然后我通過運行以下命令啟動我的應用程序: docker-compose up --build一切正常。 docker 構建映像並創建其容器。 我的應用程序工作正常,但是當我刪除它的圖像(node.js 圖像,出於某些原因)並運行docker-compose up --build命令時,它會為我拋出此錯誤:

Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Building express-app
error checking context: 'can't stat '/home/project1/pgdata/pgdata''.
ERROR: Service 'express-app' failed to build

之后,我意識到 docker 在掛載目錄(pgdata)中創建了一個目錄

所以我用'ls -ltrha'檢查它的權限,這是output:

total 12K
drwxr-xr-x  3 mjb              mjb  4.0K FEB   20 12:34 .
drwx------ 19 systemd-coredump root 4.0K FEB   20 12:34 pgdata
drwxr-xr-x  6 mjb              mjb  4.0K FEB   21 12:19 ..

當您構建 Docker 映像時,您提供的上下文目錄(通常是當前目錄)將發送到 Docker 守護程序進行構建。 這樣做的目的是能夠將文件從上下文目錄COPY到 Docker 映像中,這樣您就可以擁有一個獨立的映像,無需單獨安裝應用程序代碼即可運行。

在您的設置中,數據庫內容存儲在./pgdata中,因此是您用作構建上下文的目錄的子目錄。 該目錄中的數據將由數據庫容器中的用戶擁有,該用戶通常與主機用戶不同(這沒關系)。 但是現在由於不同的用戶擁有./pgdata目錄,因此映像構建序列無法將構建上下文目錄發送到 Docker 守護程序,因此您會收到錯誤消息。

您可以創建一個.dockerignore文件來告訴 Docker 從映像構建中排除數據庫數據(無論如何,您都不會希望在映像中使用它)。 將其放在與Dockerfiledocker-compose.yml文件相同的目錄中。 它可以只包含

# .dockerignore
# Do not copy host's node_modules into the image; we will RUN npm install
node_modules
# Do not copy database storage into the image at all
pgdata

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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