我如何保证 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

然后我通过 运行ning 这个命令启动我的应用程序: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' 检查它的权限,这是输出:

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 file 来告诉 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