Node.js 我如何保证docker主机卷在多次“docker compose up”后具有正确的权限&`码头工人放下`
我正在开发一个Node.js应用程序,它使用Postgres作为数据库。我为Node.js和Postgres编写了一个“docker compose.yml”文件 我创建pgdata目录,然后编写Dockerfile来构建Node.js映像:Node.js 我如何保证docker主机卷在多次“docker compose up”后具有正确的权限&`码头工人放下`,node.js,docker,docker-compose,volume,docker-volume,Node.js,Docker,Docker Compose,Volume,Docker Volume,我正在开发一个Node.js应用程序,它使用Postgres作为数据库。我为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”文件的方式
FROM node:14.15.0
WORKDIR "/usr/src/app"
CMD [ "npm", "start" ]
下面是我编写“docker compose.yml”文件的方式:
版本:“3.7”
服务:
db:
图片:博士后:13
环境文件:
-./.环境博士后
卷数:
-类型:绑定
资料来源:./pgdata
目标:/var/lib/postgresql/data
卷:
诺考比:真的
环境:
PGDATA:/var/lib/postgresql/data/PGDATA
容器名称:${APP\u name}-db
快速应用程序:
图像:${APP_NAME}-express应用程序:1
建造:
上下文:。
dockerfile:./dockerfile
卷数:
-类型:绑定
来源:。
目标:/usr/src/app
卷:
诺考比:真的
环境文件:
-./环境
-./.环境博士后
取决于:
-分贝
端口:
-“${APP_PORT}:${DOCKER_CONTAINER_APP_PORT}”
环境:
POSTGRES_主机:db
然后我通过运行以下命令启动我的应用程序:docker compose-up--build
,一切正常。docker构建图像并创建其容器。我的应用程序工作正常,但当我删除其映像(node.js image,出于某些原因)并运行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”检查it权限,这是输出:
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守护进程进行构建。这样做的目的是能够
将文件从上下文目录复制到Docker映像中,这样您就可以拥有一个自包含映像,无需单独装入应用程序代码即可运行
在您的设置中,数据库内容存储在/pgdata
中,因此您将使用目录的子目录作为生成上下文。该目录中的数据将由数据库容器中的用户拥有,而该用户通常与主机用户不同(这没关系)。但是现在由于另一个用户拥有/pgdata
目录,映像构建序列无法将构建上下文目录发送到Docker守护进程,因此会出现错误
您可以创建一个通知Docker从映像生成中排除数据库数据(无论发生什么情况,您都不会希望在映像中包含这些数据)。将其与Dockerfile
和docker compose.yml
文件放在同一目录中。它可以只包含
#dockrignore
#不要将主机的节点_模块复制到映像中;我们将运行npm安装
节点单元
#根本不要将数据库存储复制到映像中
pgdata
谢谢。这有什么安全原因吗?我认为这是为了防止我/黑客访问其他用户,你怎么看?我说得对吗?