gpt4 book ai didi

Docker 卷未安装/链接

转载 作者:行者123 更新时间:2023-12-02 21:04:42 27 4
gpt4 key购买 nike

我在 Docker Desktop for Windows 中。我正在尝试使用 docker-compose 作为构建容器,它在其中构建我的代码,然后代码位于我的本地构建文件夹中。构建过程肯定是成功的;当我exec进入我的容器,文件就在那里。但是,我的本地文件夹没有任何 react ——没有 build文件夹被创建。

docker -compose.yml

version: '3'
services:
front_end_build:
image: webapp-build
build:
context: .
dockerfile: Dockerfile
ports:
- 5000:5000
volumes:
- "./build:/srv/build"


Dockerfile
FROM node:8.10.0-alpine

EXPOSE 5000

# add files from local to container
ADD . /srv

# navigate to the directory
WORKDIR /srv

# install dependencies
RUN npm install --pure-lockfile --silent

# build code (to-do: get this code somewhere where we can use it)
RUN npm run build

# install 'serve' and launch server.
# note: this is just to keep container running
# (so we can exec into it and check for the files).
# once we know that everything is working, we should delete this.
RUN npx serve -s -l tcp://0.0.0.0:5000 build

我还尝试删除为文件夹提供服务的最后一行。然后我确实得到了一个构建文件夹,但那个文件夹是空的。

更新:
我还尝试了多阶段构建:
FROM node:12.13.0-alpine AS builder
WORKDIR /app
COPY . .
RUN yarn
RUN yarn run build

FROM node:12.13.0-alpine
RUN yarn global add serve
WORKDIR /app
COPY --from=builder /app/build .
CMD ["serve", "-p", "80", "-s", "."]

当我的卷未设置(或设置为一些不存在的源目录,例如 ./build:/nonexistent )时,应用程序会正确提供,并且我在本地计算机上得到一个空的构建文件夹(因为源文件夹不存在而为空) t 存在)。

但是,当我设置我的 volumes- "./build:/app" (构建文件的正确来源),我不仅得到一个空的 build我本地机器上的文件夹 app容器中的文件夹也是空的!

看来正在发生的事情是这样的
1. Container被构建,它在builder中构建文件。
2. 文件从生成器复制到第二个容器。
3. 卷是链接的,然后因为我的本地 build文件夹为空,其在容器上的链接文件夹也变为空!

我试过重置我的共享驱动器凭据,但无济于事。

我该怎么做呢?!?!

最佳答案

我相信您误解了主机卷的工作方式。体积定义:

./build:/srv/build

在撰写文件中将挂载 ./build来自 /srv/build 的主持人容器内。这发生在运行时,而不是在您的镜像构建期间,因此在执行 Dockerfile 指令之后。镜像中的任何内容都不会复制到主机,并且挂载目录中的任何文件都不可见(这是 Linux mount 命令的标准行为)。

如果您需要将文件从容器复制回主机,有多种选择。
  • 您可以执行步骤来填充构建文件夹作为容器运行的一部分。这在开发中很常见。为此,您的 CMD可能会变成一个包含几个要运行的命令的脚本,最后一步是 exec运行您的应用程序。
  • 您可以切换到命名卷。 Docker 将使用图像的内容初始化这些。甚至可以为主机上的文件夹创建命名绑定(bind)挂载,这与主机挂载几乎相同。有一个命名绑定(bind)挂载的示例 in my presentation here .
  • 您的容器入口点可以在启动时将文件复制到主机挂载。这通常出现在将在未知情况下运行的图像上,例如 Jenkins 图像做到了这一点。我也在我的示例 base image 中的保存/加载卷脚本中执行此操作.
  • 关于Docker 卷未安装/链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772625/

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