我如何保证 Docker 主机卷在多次"docker-compose up"和"docker-compose-down"后具有正确的权限



我正在开发一个使用Postgres作为其数据库的Node.js应用程序。我写了一篇"docker- composition .yml"。Node.js文件&Postgres。

我创建了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'检查它的权限,这是输出:

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

最新更新