我正在构建一个新图像,并将内容从主机操作系统文件夹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
如果不(至少部分)重建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 .
第二个构建命令将重用以前的静态图像,只复制内容,而不必重建整个图像。即使有很多文件,它也应该相当快。你不需要有一个运行的容器。
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
我要将文件夹从主机操作系统(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图像后,我探索: 有没有办法有效地导出图像? 注:我已经提到了这一点。这个问题不是它的重复。它没有解决我上面提到的用例。