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

我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。

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

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


当前回答

从容器复制到主机目录

docker cp [container-name/id]:./app/[index.js] index.js

(假设您在dockerfile中创建了一个workdir/app)

从主机复制到容器

docker cp index.js [container-name/id]:./app/index.js

其他回答

如果需要在正在运行的容器上执行此操作,可以使用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或相关联的hodgkin。

如果要将主机上/tmp/somefile中的所有内容复制到容器中的/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

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

这个简单的docker cp解决了这个任务。

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

如何获取container_name?

 docker ps 

有一个NAMES部分。不要使用aIMAGE。

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

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

要使用共享目录共享文件,请键入以下命令运行容器:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

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

容器向上语法:

docker run -v /HOST/folder:/Container/floder 

在docker文件中

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"

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中包含的多个文件可以通过以下方式复制到目标文件夹中:

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

参考:Docker CLI docs for cp

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