gpt4 book ai didi

docker - 容器内文件系统的更改未反射(reflect)在 docker 卷中的主机上

转载 作者:行者123 更新时间:2023-12-02 20:45:16 25 4
gpt4 key购买 nike

我正在使用 TypeScript 编写的 Express 服务器。项目的流程是我有一个 npm 构建脚本,它在 src 文件夹中获取项目文件并将它们编译到 dist 文件夹。这两个文件夹都位于根目录下。该项目有效,但是在尝试将所有内容移动到 docker 时,尽管我正在安装卷并且容器中存在构建文件(dist 目录),但更改并未反射(reflect)在主机上。 (我正在为 Docker 使用 Windows + VirtualBox)

我提到了thisthis问题。我看到他们的情况是一样的,但他们的解决方案似乎对我不起作用。我确保我使用了这些答案中提到的类似技术,它们似乎不起作用。

项目目录结构:

├── Backend
│ ├── src/
│ │ ├── controllers/
│ │ ├── models/
│ │ ├── routes/
│ │ ├── services/
│ │ ├── index.ts
│ │ └── server.ts
│ ├── dist/ (Created upon compilation)
│ │ ├── controllers/
│ │ ├── data/ (Created upon starting the server)
│ │ ├── models/
│ │ ├── routes/
│ │ ├── services/
│ │ ├── index.js
│ │ └── server.js
│ ├── Dockerfile
│ ├── package.json
│ ├── tsconfig.json
│ ├── tslint.json
│ └── .env
├── Frontend/ (This part is an independent application)
├── docker-compose.yml
└── README.md


当服务器启动时,它会在 %proj_root%/Backend/dist 中创建一个目录。命名为 data它用于通过 txt 文件向应用程序提供输入。从我放在 Dockerfile 中的 ls 命令可以看出,编译工作正常,但是在容器内部完成的更改(创建 dist 目录)不会反射(reflect)在主机上。在主机上,dist 目录为空,导致服务器崩溃,因为没有 server.js 文件。

这是我的 docker-compose.yml:
version: "3"
services:
backend:
build:
context: ./Backend/
volumes:
- ./Backend/dist:/app/dist
- /app/node_modules
- ./Backend:/app
frontend:
build:
context: ./Frontend
ports:
- "3001:8080"
volumes:
- /app/node_modules
- ./Frontend:/app

这是后端服务的 Dockerfile:
FROM node:8
WORKDIR /app
COPY ./package.json .
RUN npm install
COPY . . # Copying everything to enable standalone usage
RUN ls # Logging before tsc build
RUN npm run build
RUN ls /app/dist # Logging after tsc build. All the built files are visible.
CMD ["npm", "run", "start"]

运行时 docker-compose up ,应在容器( /app/dist )中创建 dist 文件夹,并应在主机上反射(reflect)为 %proj_root%/Backend/dist
我知道我可以创建一个编译 TS 然后运行 ​​docker-compose 的脚本,但这对我来说似乎是一种 hacky 方法。有更好的解决方案吗?

最佳答案

docker-compose.yml你展示的设置做了两个独立的事情。首先,它使用 Dockerfile 构建一个 Docker 镜像。你给它孤立。其次,它获取该镜像、挂载卷并应用其他设置,并根据这些设置运行容器。 Docker 镜像构建顺序忽略了所有这些其他设置;您在 Dockerfile 中所做的任何事情都无法更改主机系统上的文件。

运行容器时,volumes: 中的任何内容您完全传入的设置替换 从那个图像中产生了什么。这始终是一种单向“插入容器”:主机的 Backend 的内容目录替换 /app在容器中;匿名卷的内容替换其node_modules ,以及主机的list的内容目录替换 /app/dist .

对此有一个特殊情况异常(exception)。启动容器时,如果卷挂载为空,则镜像中的内容将被复制到卷中。只有在卷树中完全没有任何内容时才会发生这种情况。如果dist 中已有内容主机目录,或 node_modules匿名卷,这会替换镜像中的任何内容,即使它在镜像中发生了变化(或者在卷中发生了变化,Docker 无法判断)。

作为一种一次性的解决方法,如果您

rm -rf dist

那么下次启动容器时,Docker 会注意到 dist目录为空并从图像中重新填充它。

我建议只删除这些 volumes:完全设置。如果您正在积极开发软件,请在主机上进行:Node 很容易使用典型的 OS 包管理器安装,您的 IDE 不会被隐藏在容器中的 Node 解释器混淆,而且您不会点击这类问题。当您进行部署时,您可以按原样使用 Docker 镜像,而无需单独分发也在镜像内部的代码。

关于docker - 容器内文件系统的更改未反射(reflect)在 docker 卷中的主机上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55884843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com