当前位置: 首页 > 知识库问答 >
问题:

将内容从主机操作系统复制到Docker映像,而不重建映像

严易安
2023-03-14

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

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
COPY scrapy to /root/scrapy

    

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

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

更新1

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

我尝试了以下命令,但都出现了错误:

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

其中<代码>

docker run -v //D/Programs/scrapy:/root/scrapy scrapy

docker run -v scrapy:/root/scrapy scrapy

docker run -it -v //D/Programs/scrapy:/root/scrapy scrapy

docker run -it -v scrapy:/root/scrapy scrapy

根据@Makariy的反馈,使用cp命令更新

docker images-a提供:

REPOSITORY                             TAG        IMAGE ID       CREATED        SIZE
scrapy                                 latest     e35e03c8cbbd   29 hours ago   5.71GB
<none>                                 <none>     2089ad178feb   29 hours ago   5.71GB
<none>                                 <none>     6162a0bec2fc   29 hours ago   5.7GB
<none>                                 <none>     116a0c593544   29 hours ago   5.7GB
mcr.microsoft.com/windows/servercore   ltsc2019   d1724c2d9a84   5 weeks ago    5.7GB

我运行docker run-it scrapy然后docker容器ls,它给出:

CONTAINER ID   IMAGE     COMMAND                    CREATED              STATUS              PORTS     NAMES
1fcda458a14c   scrapy    "c:\\windows\\system32…"   About a minute ago   Up About a minute             thirsty_bassi

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

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

因此,在一个单独的PowerShell实例中,我运行docker cp D:\Programs\scrapy-surry\u-bassi:/root/scrapy,它在PowerShell中没有显示任何输出,所以我认为它应该做些什么。

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

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

更新2

我的文件夹结构:

D:\Programs
    Dockerfile
    \image_addons
    Dockerfile
        \scrapy

PS D:\程序

成功构建95676d084e28
成功标记scrapybase:latest

PS D:\Programs\image\u插件

步骤2/2: COPY scrapy到 /root/scrapyCOPY失败:在构建上下文中找不到文件或被. docker忽略:stat到:文件不存在

文档文件A

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

Dockerfile B

FROM scrapybase
COPY scrapy to /root/scrapy

共有3个答案

邢焱
2023-03-14

如果不(至少部分)重建Docker图像,则无法更改它。但是你不必全部重建,你可以复制你的内容来重建这个层。

您可以优化构建,使其具有两个图像:

  • 第一个图像是您不希望每次都重建的静态图像。让我们称之为刮底
  • 第二个也是最后一个图像基于第一个图像,并且只存在于复制动态内容的目的

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

并像这样构建它:

docker build -t scrapy-base .

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

scrapy的Dockerfile:

FROM scrapy-base

COPY scrapy /root/scrapy

使用构建命令:

docker build -t scrapy .

第二个构建命令将重用以前的静态图像,只复制内容,而不必重建整个图像。即使有很多文件,它也应该相当快。你不需要有一个运行的容器。

公羊新
2023-03-14
docker run -it -v c:/programs/test:/root/test ubuntu:latest cat /root/test/myTestFile.txt

快速更新一个文件:如果你不必构建代码(我不知道你使用的是什么语言),你可以用初始代码构建一些基本映像,当你只想更改一个文件时(同样,我假设你不需要为此再次编译项目,否则,由于编译的编程语言的性质,如果你这样做是不可能的):

FROM previous-version-image:latest
COPY myfile dest/to/file

然后,因为您的CMD和入口点是从之前的阶段保存的,所以无需声明它们。(如果您不记得,请使用docker history。)

请注意,不要重复使用这种方法,否则你会得到一个包含许多无用层的非常大的图像。仅用于快速测试和调试。

通常人们使用它在docker容器上进行前端开发,但基本思想仍然存在,您使用安装的依赖项创建基本工作映像,并使用最后一个Dockerfile命令作为开发服务器启动命令创建目录布局设置。

Dockerfile文件:

# pull the base image
FROM node:slim

# set the working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# copy dependencies files
COPY package.json ./

COPY package-lock.json ./

# install app dependencies
RUN npm install

# add app
COPY . ./

# start development server
CMD ["npm", "start"]

启动命令:

docker run -it --rm \
-v ${PWD}:/app \       <mount current working directory in host to container in path /app>
-v /app/node_modules \ <or other dependency directory if exists>
-p 80:3000 \           <ports if needs exposing>
ps-container:dev

我不确定这个用例是否能百分之百地为您工作,因为它需要始终使用绑定装载来装载代码,而在需要导出时,则必须导出为映像和源代码目录,另一方面,它允许您在每次添加新内容时快速更改图像,而无需等待图像生成,并最终生成包含所有所需内容的最终图像。

如您所见,主机上有一个文件包含一些文本

docker run -it -v c:/programs/test:/root/test ubuntu:latest cat /root/test/myTestFile.txt

希望你能从我这里提供的东西中找到适合你的东西。

感谢本教程和此示例,以开始示例和信息。

编辑:

假设您的原始Dockerfile如下所示:

FROM python:latest
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD python /app/app.py

这将在上面构建您的初始图像,我们将添加层并更改python文件。我们将使用的下一个Dockerfile(我们称之为Dockerfile.fix文件)将复制我们要更改的文件,而不是图像中已有的文件

FROM previous-image-name
COPY app.py .

现在,使用此Dockerfile构建后,最终的图像Dockerfile看起来(有点)像这样:

FROM python:latest
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD python /app/app.py
FROM previous-image-name
COPY app.py .

每次我们想要更改文件时,我们都会使用第二个Dockerfile

卫阳炎
2023-03-14

您还可以使用docker cp,将文件从主机手动复制到正在运行的容器中

docker cp ./path/to/file containername:/another/path

文档

 类似资料:
  • 我要将文件夹从主机操作系统(Windows)复制到docker映像。 我的Docker文件是D:\Programs> Docker文件 复制失败:在生成上下文中找不到文件或被.dockerignore:stat test:文件不存在 我尝试了命令和 我知道发生此错误是因为我复制的路径必须相对于构建上下文(.in docker构建)。它不能是生成上下文之外的系统上的任意路径。 null 更新1 我将

  • 我的问题与这个关于将文件从容器复制到主机的问题有关;我有一个Dockerfile,它获取依赖项,从源代码编译构建工件,并运行一个可执行文件。我还想复制构建工件(在我的例子中,它是由'../target/'中的生成的,但我认为这个问题也适用于JAR、二进制文件等。 用于容器,而不是图像;我是否需要启动一个容器来从其中获取一个文件?在一个脚本中,我尝试在后台以交互模式运行,将文件复制出去,然后杀死容器

  • 问题内容: 我不确定我在问正确的问题…但是当我阅读所有可以接触到的docker时,我发现可以在Ubuntu 12.04上安装Docker(例如),然后安装一个Fedora容器还是其他版本的ubuntu?(有一个示例,其中用户在容器中安装了busybox。) 当然,我可能完全错了。 但是,我希望基本系统与容器之间存在短暂的连接。 重述:主机操作系统和容器基础映像的操作系统之间是什么关系? 问题答案:

  • 我开始使用Docker,我可以说,这是一个伟大的概念。到目前为止一切都很顺利。我在ubuntu(我的主机操作系统)上安装了docker,从存储库中播放图像并制作新图像。 我想制作当前(主机)操作系统的映像。我如何使用docker本身实现这一点?我是docker的新手,所以请忽略我问题中的任何愚蠢的事情,如果有的话。

  • 我下面有DockerFile“ 得到的Docker映像封装了Java程序。当我将这个Docker映像部署到Windows Server或Linux时,映像是否总是包括运行在主机OS(Windows Server或Linux)之上的操作系统(如Linux)? 我问这个问题的意义是Docker映像是包含其他盒子的物理盒子(其中一个是openjdk),这个盒子是否也包含Linux OS盒子,我可以从中取

  • 使用时,保存的图像是独立的,因此图像的大小会变大。(~对于10个图像,大小约为9GB) 在提取docker图像后,我探索: 有没有办法有效地导出图像? 注:我已经提到了这一点。这个问题不是它的重复。它没有解决我上面提到的用例。