草庐IT

如何将文件从主机复制到 Docker 容器?

HuntsBot 2023-08-07 原文

问:

我正在尝试为我们使用的 Docker 容器构建备份和恢复解决方案。

我有我创建的 Docker 基础映像 ubuntu:base,并且不希望每次都使用 Docker 文件重新构建它以向其中添加文件。

我想创建一个从主机运行的脚本,并使用 ubuntu:base Docker 映像创建一个新容器,然后将文件复制到该容器中。

如何将文件从主机复制到容器?

答1:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

cp 命令可用于复制文件。

可以将一个特定文件复制到容器中,例如:

docker cp foo.txt container_id:/foo.txt

可以从容器中复制一个特定文件,例如:

docker cp container_id:/foo.txt foo.txt

为了强调,container_id 是 容器 ID,不是 图像 ID。 (使用 docker ps 查看包含 container_id 的列表。)

可以使用以下方法将文件夹 src 包含的多个文件复制到 target 文件夹中:

docker cp src/. container_id:/target
docker cp container_id:/src/. target

参考:Docker CLI docs for cp

在 1.8 之前的 Docker 版本中,只能将文件从容器复制到主机。不是从主机到容器。

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

另请注意,这可以在主机 vm 或主操作系统上,并且可以在主机到容器或 vm 到主机(或主操作系统)上工作

在 Dockerfile 中,您可以使用 ADD 关键字在构建期间添加文件。

@h3nrik COPY preferred over ADD 适用时。

使用 docker cp 从容器复制到主机效果很好,但是当使用它将文件从主机复制到容器时,没有效果......有人知道为什么吗? docker 版本:Docker 版本 1.10.3,构建 cb079f6-unsupported

我可以使用 docker cp 从主机复制多个文件到容器吗?

答2:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

获取容器名称或短容器 id:$ docker ps 获取完整容器 id:$ docker inspect -f ‘{{.Id}}’ SHORT_CONTAINER_ID-or-CONTAINER_NAME 复制文件:$ sudo cp path-file-host /var/lib/码头工人/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE

例子:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

或者

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

对我来说,主机的安装路径不包含 aufs,而是包含 devicemapper。检查容器安装路径(在运行时)的最简单方法是运行命令 mount。

我尝试了上述解决方案。它将文件复制到 docker 特定目录中。但是,当我将 bash 用于 docker 容器时,文件不会出现在那里。有什么我想念的吗?

新路径是 /var/lib/docker/devicemapper/mnt/<>/rootfs/

对我来说,在 Docker 1.4.1(当前最新版本)上,它是 /var/lib/docker/aufs/diff//

可怜的 MacOS 用户呢?对我来说,挂载目录在 /var/lib 中。 find / -name docker 也没有帮助。

答3:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

最干净的方法是在启动容器时在容器上挂载一个主机目录:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

你怎么能运行容器?我以为你只能用图像来做到这一点。

当容器存在时,我无法让它工作,也就是之前运行过。下面的焦油效果很好。

这对我有用的唯一方法是在运行图像的同时附加卷(实例化容器)。结束于:docker run -d -p -v /host/path:/mnt --name container_name image_name

这对我不起作用。至少不能运行容器。只能运行图像

我很惊讶 docker cp 是一种单向操作!

答4:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

以下是一种相当丑陋的方法,但它有效。

docker run -i ubuntu /bin/bash -c 'cat > file' < file

这很好用!但不要忘记提交更改:docker commit docker ps -l -q ubuntu-with-file。否则更改将丢失(使用您想要的任何名称而不是 ubuntu-with-file)

此外,我们可以使用新的 docker exec 功能来处理正在运行的容器:docker exec -it bash -c 'cat > /path/to/container/file' < /path/to/host/file/

@Mikl 我认为它应该是 docker exec -i ... 而不是 -it,因为从文件输入时没有 TTY。

如果您仍然停留在旧版本的 Docker 上(就像我一样)并且想要复制整个目录,您可以这样做:tar -c -v -f - /path/to/host/directory | docker exec -i bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'

嗯,这不适用于 Docker 19.03.8、主机 Centos 8、ubuntu:18.04 映像。它确实在容器上创建了 file,但它是空白的。

答5:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

通常有以下三种类型:

从容器到主机 docker cp container_id:./bar/foo.txt 。

docker cp 命令也可以双向工作。

https://i.stack.imgur.com/qnhSi.jpg

从主机到容器 docker exec -i container_id sh -c ‘cat > ./bar/foo.txt’ < ./foo.txt 从主机复制到容器的第二种方法:docker cp foo.txt mycontainer:/foo。文本

https://i.stack.imgur.com/5GaiK.jpg

从容器到容器混合 1 和 2 docker cp container_id1:./bar/foo.txt 。 docker exec -i container_id2 sh -c ‘cat > ./bar/foo.txt’ < ./foo.txt

https://i.stack.imgur.com/pGr45.jpg

docker cp 双向工作。无需执行、cat 和重定向。 docker cp host_file.txt 容器:/path/

如果需要复制多个文件,tar 非常方便,如下所示:tar -czvf tmp.tar.gz *.* && docker exec -i container_id2 sh -c 'cat > ./bar/tmp.tar.gz && tar -xzvf tmp.tar.gz' < ./tmp.tar.gz

答6:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

如果您需要在正在运行的容器上执行此操作,您可以使用 docker exec(在 1.3 中添加)。

首先,找到容器的名称或 ID:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

在上面的示例中,我们可以使用 b9b7400ddd8f 或 elated_hodgkin。

如果您想将主机上 /tmp/somefiles 中的所有内容复制到容器中的 /var/www:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

然后我们可以在容器中执行 /bin/bash 并验证它是否有效:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

在 Centos 7.4 上的 docker 1.16 上运行良好 伟大的创新理念。

答7:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

创建一个新的 dockerfile 并使用现有的图像作为您的基础。 FROM myName/myImage:latest ADD myFile.py bin/myFile.py 然后构建容器: docker build 。

这对我有用。没有其他的。谢谢!

它将创建一个新图像,而不是直接创建一个新容器。如果您在 myFile.py 更改时重用此图像,它将使用该文件的旧版本,除非您重建该图像。

仅当您在远程服务器上进行测试时,我才发现这是最快的方法。

根据 this,大多数人应该使用 COPY 而不是 ADD。但是对于本地文件(如本例中),它们是等价的。

答8:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

解决方案如下,

从 Docker 外壳,

root@123abc:/root#  <-- get the container ID

来自主持人

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc/rootfs/root

该文件应直接复制到容器位于文件系统上的位置。

很好的答案。在较新的 docker 版本中,路径已重命名为 /var/lib/docker/aufs/mnt/

devicemapper 路径似乎不适用于 docker 1.6 的 Fedora。已将其作为单独的 Q,stackoverflow.com/questions/29939419/… 提出,任何评论将不胜感激。

文件 /var/lib/docker 不存在....

答9:

huntsbot.com – 高效赚钱,自由工作

将文件复制到正在运行的容器中的另一种解决方案是使用 tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

将文件 foo.sh 复制到容器的 /tmp 中。

编辑:删除冗余 -f,感谢 Maarten 的评论。

如果您需要发送整个目录,这很好。对于单个文件,Erik 的回答更简单。

@Kelvin:但 tar 也保留文件属性和名称。其中,这意味着您只需键入一次名称(然后您就可以从 shell 中获得制表符完成)。所以我想说 tar 实际上更简单,只要它安装在容器中。

-f - 虽然有点多余,但默认行为是无论如何都要写入标准输出。

这意味着存在对 tar 的主机依赖

你是对的 - 你需要 tar 安装在主机和容器内。现在使用 docker cp 是更好的解决方案。

答10:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

将文件从主机复制到正在运行的容器

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

基于 Erik’s answer 以及 Mikl 和 z0r 的评论。

接受的解决方案有时会在传输到正在运行的容器时干扰文件的缩进。这非常适合这种情况

答11:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

这是对标题中这个问题中提出的“将文件从主机复制到 Docker 容器”问题的直接回答。

试试 docker cp。这是最简单的方法,甚至可以在我的 Mac 上使用。用法:

docker cp /root/some-file.txt some-docker-container:/root

这会将您主机上目录 /root 中的文件 some-file.txt 复制到名为 some-docker-container 的 Docker 容器中,并复制到目录 /root 中。它非常接近安全复制语法。如上一篇文章所示,您可以反之亦然。即,您还将文件从容器复制到主机。

在您下载此帖子之前,请输入 docker cp --help。阅读文档可能会很有帮助,有时…

如果您不喜欢这种方式,并且希望在您已经创建和运行的容器中存储数据量,那么娱乐是您今天唯一的选择。另请参阅How can I add a volume to an existing Docker container?。

原文链接:https://www.huntsbot.com/qa/xM53/how-to-copy-files-from-host-to-docker-container?lang=zh_CN&from=csdn

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

有关如何将文件从主机复制到 Docker 容器?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  5. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  6. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  7. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  8. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

随机推荐