use*_*829 1391 docker docker-container
我正在尝试为我们使用的Docker容器构建备份和还原解决方案.
我有我创建的Docker基本映像ubuntu:base
,并且不希望每次都使用Docker文件重建它以向其添加文件.
我想创建一个从主机运行的脚本,并使用ubuntu:base
Docker镜像创建一个新容器,然后将文件复制到该容器中.
如何将文件从主机复制到容器?
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)
在1.8之前的Docker版本中,只能将文件从容器复制到主机.不是从主机到容器.
小智 166
获取容器名称或短容器ID:
$ docker ps
Run Code Online (Sandbox Code Playgroud)获取完整的容器ID:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
Run Code Online (Sandbox Code Playgroud)拷贝文件:
$ 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)
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)
小智 110
以下是一种相当丑陋的方式,但它的工作原理.
docker run -i ubuntu /bin/bash -c 'cat > file' < file
Run Code Online (Sandbox Code Playgroud)
小智 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)
在上面的例子中,我们可以使用b9b7400ddd8f
或elated_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
解决方案如下,
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)
该文件应直接复制到容器在文件系统上的位置.
Bre*_*len 35
创建一个新的dockerfile并使用现有图像作为基础.
FROM myName/myImage:latest
ADD myFile.py bin/myFile.py
Run Code Online (Sandbox Code Playgroud)然后构建容器:
docker build .
Run Code Online (Sandbox Code Playgroud)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
通常有三种类型:
从容器到主机
docker cp container_id:./bar/foo.txt .
Run Code Online (Sandbox Code Playgroud)从主机到容器
docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
Run Code Online (Sandbox Code Playgroud)从一个容器到另一个容器,混合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)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
.
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.
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
Run Code Online (Sandbox Code Playgroud)
目标路径必须预先存在
假设容器已在运行,请键入给定的命令:
# 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)
注意:由于容器的用户与主机的用户不同,因此可能会出现权限问题.
小智 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)
它将文件/文件夹从 复制PATH
到HOSTPATH
.
在docker环境中,所有容器都在目录中找到:
/var/lib/docker/aufs/required-docker-id/
要将源目录/文件复制到容器的任何部分,请键入给定的命令:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
如果主机是 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)
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)
如果像我这样的人不清楚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 ls
或docker ps
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 次 |
最近记录: |