将内容从主机操作系统复制到 Docker 映像中,无需重建映像

Flo*_*Flo 6 containers copy image docker

我正在构建一个新映像,并将主机操作系统文件夹 D:\\Programs\\scrapy 中的内容复制到其中,如下所示:docker build . -t scrapy

\n

Dockerfile

\n
FROM mcr.microsoft.com/windows/servercore:ltsc2019\nSHELL ["powershell", "-Command", "$ErrorActionPreference = \'Stop\'; $ProgressPreference = \'SilentlyContinue\';"]\n\nRUN mkdir root\nRUN cd root\nWORKDIR /root\nRUN mkdir scrapy\nCOPY scrapy to /root/scrapy\n\n    \n
Run Code Online (Sandbox Code Playgroud)\n

现在,当我将新内容添加到主机操作系统文件夹“D:\\Programs\\scrapy”时,我还想将其添加到图像文件夹“root/scrapy”,但我不想构建一个全新的图像( \n那么我如何保留现有图像并覆盖图像文件夹“root/scrapy”的内容。
\n另外:我不想每次运行容器时都复制新内容(所以不是在运行时),我只想有一个单独的命令将更多文件添加到现有映像,然后运行另一个时间基于该图像的新容器。

\n

我在这里检查:如何在不重建图像的情况下更新源代码(但不确定OP是否尝试与我做同样的事情)

\n

更新1

\n

检查Windows 的Dockerfile和docker --volume 格式中 VOLUME 的用途是什么

\n

我尝试了以下命令,均导致错误:

\n
\n

docker:来自守护程序的错误响应:无效的卷规范:\'\'。请参阅“docker run --help”。

\n
\n

<pathiused>例如在哪里D:/Programs/scrapy:/root/scrapy

\n
docker run -v //D/Programs/scrapy:/root/scrapy scrapy\n\ndocker run -v scrapy:/root/scrapy scrapy\n\ndocker run -it -v //D/Programs/scrapy:/root/scrapy scrapy\n\ndocker run -it -v scrapy:/root/scrapy scrapy\n
Run Code Online (Sandbox Code Playgroud)\n

cp根据 @Makariy\ 的反馈更新命令

\n

docker images -a给出:

\n
REPOSITORY                             TAG        IMAGE ID       CREATED        SIZE\nscrapy                                 latest     e35e03c8cbbd   29 hours ago   5.71GB\n<none>                                 <none>     2089ad178feb   29 hours ago   5.71GB\n<none>                                 <none>     6162a0bec2fc   29 hours ago   5.7GB\n<none>                                 <none>     116a0c593544   29 hours ago   5.7GB\nmcr.microsoft.com/windows/servercore   ltsc2019   d1724c2d9a84   5 weeks ago    5.7GB\n
Run Code Online (Sandbox Code Playgroud)\n

我运行docker run -it scrapy然后docker container ls给出:

\n
CONTAINER ID   IMAGE     COMMAND                    CREATED              STATUS              PORTS     NAMES\n1fcda458a14c   scrapy    "c:\\\\windows\\\\system32\xe2\x80\xa6"   About a minute ago   Up About a minute             thirsty_bassi\n
Run Code Online (Sandbox Code Playgroud)\n

如果我运行docker cp D:\\Programs\\scrapy scrapy:/root/scrapy我会得到:

\n
\n

错误:没有这样的容器:路径:scrapy:\\root

\n
\n

因此,在一个单独的 PowerShell 实例中,我运行了docker cp D:\\Programs\\scrapy thirsty_bassi:/root/scrapyPowerShell 中没有显示任何输出的命令,所以我认为它应该已经做了一些事情。

\n

但是,在我的容器实例中,当我转到 /root/scrapy 文件夹时,我只看到构建图像时已添加的文件,而不是我想要添加的新文件。

\n

另外,我想我正在将文件添加到此处的容器中,但是没有办法将其添加到图像中吗?不重建整个图像?

\n

更新2

\n

我的文件夹结构:

\n
D:\\Programs\n    Dockerfile\n    \\image_addons\n    Dockerfile\n        \\scrapy\n
Run Code Online (Sandbox Code Playgroud)\n

PS D:\\Programs>docker build . -t scrapybase

\n

已成功构建 95676d084e28
\n已成功标记 scrapybase:latest

\n

PS D:\\Programs\\image_addons> docker build -t scrapy .

\n
\n

步骤 2/2 :将 scrapy 复制到 /root/scrapy\n复制失败:在构建上下文中找不到文件或被 .dockerignore 排除:stat 到:文件不存在

\n
\n

Dockerfile A

\n
FROM mcr.microsoft.com/windows/servercore:ltsc2019\nSHELL ["powershell", "-Command", "$ErrorActionPreference = \'Stop\'; $ProgressPreference = \'SilentlyContinue\';"]\nWORKDIR /root/scrapy\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerfile B

\n
FROM scrapybase\nCOPY scrapy to /root/scrapy\n
Run Code Online (Sandbox Code Playgroud)\n

Pie*_* B. 1

您无法在不(至少部分地)重建 Docker 映像的情况下更改它。但您不必重建所有内容,只需重建复制内容的图层即可scrapy

您可以优化您的构建以拥有两个图像:

  • 第一个图像是您不想每次都重建的静态图像。我们就这样称呼它吧scrapy-base
  • 第二张也是最后一张图像基于第一张图像scrapy-base,仅用于复制动态scrapy内容的目的

scrapy-base的 Dockerfile:

FROM mcr.microsoft.com/windows/servercore:ltsc2019
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN mkdir root
RUN cd root
WORKDIR /root
RUN mkdir scrapy
Run Code Online (Sandbox Code Playgroud)

并像这样构建它:

docker build -t scrapy-base .
Run Code Online (Sandbox Code Playgroud)

该命令只需运行一次。如果您只更改本地文件夹的内容,则无需构建此映像scrapy。(如您所见,构建根本不使用它)

scrapy的 Dockerfile:

FROM scrapy-base

COPY scrapy /root/scrapy
Run Code Online (Sandbox Code Playgroud)

使用构建命令:

docker build -t scrapy .
Run Code Online (Sandbox Code Playgroud)

第二个构建命令将重新使用以前的静态映像,并且仅复制内容,而无需重建整个映像。即使有很多文件,速度也应该很快。您不需要有一个正在运行的容器。