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

use*_*829 1391 docker docker-container

我正在尝试为我们使用的Docker容器构建备份和还原解决方案.

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

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

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

h3n*_*rik 2358

cp命令可用于复制文件.可以复制一个特定文件,如:

docker cp foo.txt mycontainer:/foo.txt
Run Code Online (Sandbox Code Playgroud)

为了强调,mycontainer是一个容器的ID,一个图像 ID.

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

docker cp mycontainer:/foo.txt foo.txt
Run Code Online (Sandbox Code Playgroud)

参考:Docker CLI文档cp

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

  • 使用`docker cp`从容器复制到主机工作得很好,但是当用它来将文件从主机复制到容器时,没有效果......任何人都知道为什么?docker version:Docker版本1.10.3,build cb079f6-unsupported (6认同)
  • 我可以使用 docker cp 将多个文件从主机复制到容器吗? (6认同)
  • 在Dockerfile中,您可以使用ADD关键字在构建期间添加文件. (4认同)
  • @ h3nrik [`COPY`优先于`ADD`](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/add-or-copy)适用时. (3认同)
  • 还要注意这可以在主机 vm 或主操作系统上,并且可以在主机到容器或 vm 到主机(或主操作系统)上工作 (2认同)
  • `docker cp foo.txt mycontainer:/` 保持容器内文件名相同(“foo.txt”) (2认同)

小智 166

  1. 获取容器名称或短容器ID:

    $ docker ps
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取完整的容器ID:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
    Run Code Online (Sandbox Code Playgroud)
  3. 拷贝文件:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    
    Run Code Online (Sandbox Code Playgroud)

例:

$ 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
Run Code Online (Sandbox Code Playgroud)

要么

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

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,主机的安装路径不包含`aufs`而是`devicemapper`.检查容器安装路径(运行时)的最简单方法是运行命令`mount`. (12认同)
  • 对于贫穷的 MacOS 用户呢?挂载目录在我的`/var/lib` 中。`find / -name docker` 也没有帮助。 (4认同)
  • 对我来说,在Docker 1.4.1(最新的)上,它是`/ var/lib/docker/aufs/diff/<id> /` (3认同)
  • 我尝试了上面的解决方案.它将文件复制到docker特定目录中.但是,当我使用bash作为docker容器时,文件不会显示在那里.有什么我想念的吗? (2认同)
  • 新路径是 /var/lib/docker/devicemapper/mnt/&lt;&lt;id&gt;&gt;/rootfs/ (2认同)

Ben*_*vis 131

最简单的方法是在启动容器时在容器上安装主机目录:

{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
Run Code Online (Sandbox Code Playgroud)

  • 这个东西对我不起作用(至少没有容器) (9认同)
  • 你怎么能运行容器?我以为你只能用图像做到这一点. (3认同)
  • 这对我不起作用.Atleast无法运行容器.只能运行图像 (2认同)
  • 我很惊讶`docker cp` 是一种单向操作! (2认同)

小智 110

以下是一种相当丑陋的方式,但它的工作原理.

docker run -i ubuntu /bin/bash -c 'cat > file' < file
Run Code Online (Sandbox Code Playgroud)

  • 另外,我们可以使用新的`docker exec`功能来处理运行容器:`docker exec -it <container_id> bash -c'cat>/path/to/container/file'</ path/to/host/file /` (48认同)
  • @Mikl我认为它应该是`docker exec -i ...`而不是`-it`,因为从文件输入时没有TTY. (17认同)
  • 这很棒!但是不要忘记提交更改:`docker commit \`docker ps -l -q \`ubuntu-with-file`.否则,更改将丢失(使用您想要的任何名称而不是"ubuntu-with-file") (6认同)
  • 如果你仍然坚持使用旧版本的Docker(就像我一样)并想要复制整个目录,你可以这样做:`tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c'tar -x -v --strip-components 1 -f - -C/path/to/container/directory'` (3认同)

小智 41

如果您需要在正在运行的容器上执行此操作,则可以使用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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们可以使用b9b7400ddd8felated_hodgkin.

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

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
Run Code Online (Sandbox Code Playgroud)

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

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2
Run Code Online (Sandbox Code Playgroud)


小智 35

解决方案如下,

从Docker shell,

root@123abc:/root#  <-- get the container ID
Run Code Online (Sandbox Code Playgroud)

来自主持人

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案.在较新的docker版本中,路径已重命名为/ var/lib/docker/aufs/mnt / (8认同)

Bre*_*len 35

很容易

  1. 创建一个新的dockerfile并使用现有图像作为基础.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后构建容器:

    docker build .
    
    Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。没有其他的。谢谢! (2认同)
  • 根据[this](https://www.ctl.io/developers/blog/post/dockerfile-add-vs-copy/),大多数人应该使用 COPY 而不是 ADD。但对于本地文件(如本例所示),它们是等效的。 (2认同)

joe*_*mat 29

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

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x
Run Code Online (Sandbox Code Playgroud)

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

编辑:删除reduntant -f,感谢Maarten的评论.


Ali*_*aji 23

通常有三种类型:

  1. 从容器到主机

    docker cp container_id:./bar/foo.txt .
    
    Run Code Online (Sandbox Code Playgroud)

开发1

  1. 从主机到容器

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    
    Run Code Online (Sandbox Code Playgroud)

开发2

  1. 从一个容器到另一个容器,混合1和2

    docker cp container_id1:./bar/foo.txt .
    
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    
    Run Code Online (Sandbox Code Playgroud)

开发3

  • docker cp可以双向工作。无需执行,分类和重定向。docker cp host_file.txt容器:/ path / (5认同)

And*_*rea 21

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

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH
Run Code Online (Sandbox Code Playgroud)

根据Erik的回答以及Mikl和z0r的评论.


joe*_*mat 13

使用Docker 1.8,docker cp可以将文件从主机复制到容器.请参阅Docker博客文章宣布Docker 1.8:内容信任,工具箱以及对Registry和Orchestration的更新.


Hir*_*ist 13

这是对标题中此问题中提出的"从主机复制文件到Docker容器"问题的直接回答.

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

docker cp /root/some-file.txt some-docker-container:/root
Run Code Online (Sandbox Code Playgroud)

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

在你下载这篇文章之前,请输入docker cp --help.阅读文档非常有用,有时......

如果您不喜欢这种方式并且想要在已创建和运行的容器中使用数据卷,那么娱乐是您今天唯一的选择.另请参见如何将卷添加到现有Docker容器?.


Aer*_*rin 12

我在这里尝试了大多数(upvoted)解决方案,但在docker 17.09(2018年)中,不再有/ var/lib/docker/aufs文件夹.

这个简单docker cp解决了这个任务.

docker cp c:\path\to\local\file container_name:/path/to/target/dir/
Run Code Online (Sandbox Code Playgroud)

如何获取container_name?

 docker ps 
Run Code Online (Sandbox Code Playgroud)

有一NAMES节.不要使用IMAGE.

  • 谢谢!这是简单的解决方案,它的工作原理 (3认同)

pra*_*upd 11

要在容器和本地文件系统之间复制文件/文件夹,请键入以下命令:

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}
Run Code Online (Sandbox Code Playgroud)

例如,

docker cp /home/foo container-id:/home/dir
Run Code Online (Sandbox Code Playgroud)

要获取contianer id,请键入给定的命令:

docker ps
Run Code Online (Sandbox Code Playgroud)

以上内容摘自docker.com.


Adi*_*yan 8

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
Run Code Online (Sandbox Code Playgroud)

目标路径必须预先存在


joh*_*odo 7

假设容器已在运行,请键入给定的命令:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"
Run Code Online (Sandbox Code Playgroud)

要使用共享目录共享文件,请通过键入给定命令来运行容器:

# docker run -v /path/to/host/dir:/path/to/container/dir ...
Run Code Online (Sandbox Code Playgroud)

注意:由于容器的用户与主机的用户不同,因此可能会出现权限问题.

  • 请注意,`cat`一旦退出就不会终止.如果对你很重要(如果你正在复制bash脚本,bash会拒绝运行它们),你应该运行`lsof | grep yourfilename`并杀死保存所述文件的`cat`进程. (2认同)

小智 7

Docker cp 命令是一个方便的实用程序,它允许在容器和主机系统之间复制文件和文件夹。

如果要将文件从主机系统复制到容器,则应使用 docker cp 命令,如下所示:

docker cp host_source_path container:destination_path
Run Code Online (Sandbox Code Playgroud)

首先使用 docker ps 命令列出正在运行的容器:

abhishek@linuxhandbook:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              
  PORTS               NAMES
  8353c6f43fba        775349758637        "bash"              8 seconds ago       Up 7 
  seconds                            ubu_container
Run Code Online (Sandbox Code Playgroud)

您需要知道容器 ID 或容器名称。就我而言,docker 容器名称是 ubu_container。并且容器 ID 是 8353c6f43fba。

如果要验证文件是否已成功复制,可以通过以下方式进入您的容器,然后使用常规 Linux 命令:

docker exec -it ubu_container bash
Run Code Online (Sandbox Code Playgroud)

将文件从主机系统复制到 docker 容器使用 docker cp 进行复制类似于 Linux 中的复制命令。

我将一个名为 a.py 的文件复制到容器中的 home/dir1 目录中。

docker cp a.py ubu_container:/home/dir1
Run Code Online (Sandbox Code Playgroud)

如果文件被成功复制,您将不会在屏幕上看到任何输出。如果目标路径不存在,您会看到一个错误:

abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub
        Error: No such container:path: ubu_container:/home/dir2
Run Code Online (Sandbox Code Playgroud)

如果目标文件已经存在,它将在没有任何警告的情况下被覆盖。

您也可以使用容器 ID 代替容器名称:

docker cp a.py 8353c6f43fba:/home/dir1
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试docker cp

用法:

docker cp CONTAINER:PATH HOSTPATH
Run Code Online (Sandbox Code Playgroud)

它将文件/文件夹从 复制PATHHOSTPATH.

  • 他从主机向容器询问,而不是相反。 (8认同)

0x3*_*bfc 6

在docker环境中,所有容器都在目录中找到:

/var/lib/docker/aufs/required-docker-id/

要将源目录/文件复制到容器的任何部分,请键入给定的命令:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/


Abd*_*UMI 6

如果主机是 CentOS 或 Fedora,则在 中没有代理/var/lib/docker/aufs,但在 下/proc

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root
Run Code Online (Sandbox Code Playgroud)

此 cmd 会将data目录的所有内容复制到/ID 为“containerid”的容器中。


小智 6

这是将数据从Docker复制到主机的命令:

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/
Run Code Online (Sandbox Code Playgroud)

以下是将数据从主机复制到docker的命令:

docker cp a.txt ccfbeb35116b:/home/
Run Code Online (Sandbox Code Playgroud)


Kla*_*urn 5

许多发现这个问题的人实际上可能会遇到在创建Docker 映像时将文件复制到其中的问题(我就是这样做的)。

在这种情况下,您可以使用用于创建映像的COPY命令。Dockerfile

请参阅文档


Eve*_*ews 5

tar并且docker cp是复制目录中所有内容的好组合。

创建数据卷容器

docker create --name dvc --volume /path/on/container cirros
Run Code Online (Sandbox Code Playgroud)

保留目录层次结构

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container
Run Code Online (Sandbox Code Playgroud)

检查你的工作

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
Run Code Online (Sandbox Code Playgroud)


小智 5

容器向上语法:

docker run -v /HOST/folder:/Container/floder 
Run Code Online (Sandbox Code Playgroud)

在 docker 文件中

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"
Run Code Online (Sandbox Code Playgroud)


ish*_*007 5

如果像我这样的人不清楚mycontainer@h3nrik 答案中的含义,它实际上是容器 ID。要复制文件WarpSquare.mp4/app/example_scenes/1440p60从激发泊坞窗容器当前文件夹我用这个。

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .
Run Code Online (Sandbox Code Playgroud)

其中docker ps -q -l拉出最后一个退出实例的容器 ID。如果它不是已退出的容器,您可以通过docker container lsdocker ps


Mou*_*SSI 5

docker cp SRC_PATH CONTAINER_ID:DEST_PATH
Run Code Online (Sandbox Code Playgroud)

例如,我想将我的文件 xxxx/download/jenkins 复制到 tomcat

我开始获取容器Tomcat的id

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/
Run Code Online (Sandbox Code Playgroud)


小智 5

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH从主机复制到容器。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH从容器复制到主机。


归档时间:

查看次数:

1052165 次

最近记录:

5 年,11 月 前