如何解决在多次`docker-compose up`和`docker-compose-down`之后,我如何保证docker主机卷具有正确的权限
我正在开发一个使用 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'检查它的权限,这是输出:
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 从镜像构建中排除数据库数据(无论如何您都不会希望在您的镜像中使用它)。将它放在与 Dockerfile
和 docker-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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。