如何获取由本地文件系统上的Docker容器生成的内容(最小失败示例)

这个问题是另一个最小的失败版本:

如何获取由本地文件系统上的Docker容器生成的内容

我有以下文件:

./test -rw-r--r-- 1 miqueladell staff 114 Jan 21 15:24 Dockerfile -rw-r--r-- 1 miqueladell staff 90 Jan 21 15:23 docker-compose.yml drwxr-xr-x 3 miqueladell staff 102 Jan 21 15:25 html ./test/html: -rw-r--r-- 1 miqueladell staff 0 Jan 21 15:22 file_from_local_filesystem 

DockerFile

 FROM php:7.0.2-apache RUN touch /var/www/html/file_generated_inside_the_container VOLUME /var/www/html/ 

泊坞窗,compose.yml

 test: image: test volumes: - ./html:/var/www/html/ 

从Dockerfile中定义的映像运行一个容器后,我想要的是:

 ./html -- file_from_local_filesystem -- file_generated_inside_the_container 

取而代之,我得到以下内容:

build立形象

 $ docker build --no-cache -t test . Sending build context to Docker daemon 4.096 kB Step 1 : FROM php:7.0.2-apache ---> 2f16964f48ba Step 2 : RUN touch /var/www/html/file_generated_inside_the_container ---> Running in b957cc9d7345 ---> 5579d3a2d3b2 Removing intermediate container b957cc9d7345 Step 3 : VOLUME /var/www/html/ ---> Running in 6722ddba76cc ---> 4408967d2a98 Removing intermediate container 6722ddba76cc Successfully built 4408967d2a98 

运行一个与以前的形象的容器

 $ docker-compose up -d Creating test_test_1 

列出本地机器文件系统上的文件

 $ ls -al html total 0 drwxr-xr-x 3 miqueladell staff 102 Jan 21 15:25 . drwxr-xr-x 5 miqueladell staff 170 Jan 21 14:20 .. -rw-r--r-- 1 miqueladell staff 0 Jan 21 15:22 file_from_local_filesystem 

从容器中列出文件

 $ docker exec -i -t test_test_1 ls -alR /var/www/html /var/www/html: total 4 drwxr-xr-x 1 1000 staff 102 Jan 21 14:25 . drwxr-xr-x 4 root root 4096 Jan 7 18:05 .. -rw-r--r-- 1 1000 staff 0 Jan 21 14:22 file_from_local_filesystem 

来自本地文件系统的卷被装载在容器文件系统上,replace它的内容。

这与我在本指南“权限和所有权”部分理解的内容相反

我怎么能得到所需的输出?

谢谢


编辑:正如在接受的答案中所说,我不明白卷时问这个问题。 卷,作为mountponint,用所装载的本地文件系统replace容器内容。

我需要的解决scheme是使用ENTRYPOINT来运行必要的命令,以便在容器运行时初始化安装的卷的内容。

源代码的代码可以在这里看到: https : //github.com/MiquelAdell/composed_wordpress/tree/1.0.0

这是你指出的指南

如果您为卷指定主机目录,则不会发生这种情况

您从其他容器或主机文件系统共享的卷将replace容器中的目录。

如果您需要添加一些文件到音量,您应该启动容器执行此操作。 你可以做一个入口点,例如touch ,然后运行你的主进程。

是的,很确定它应该是完整的path:

泊坞窗,compose.yml

 test: image: test volumes: - ./html:/var/www/html/ 

./html应该是/path/to/html

编辑

更改为完整path并运行test.sh后输出:

 $ docker exec -ti dockervolumetest_test_1 bash root@c0bd7a722b63:/var/www/html# ls -la total 8 drwxr-xr-x 2 1000 adm 4096 Jan 21 15:19 . drwxr-xr-x 3 root root 4096 Jan 7 18:05 .. -rw-r--r-- 1 1000 adm 0 Jan 21 15:19 file_from_local_filesystem 

编辑2

对不起,我误解了问题的整个前提:)

所以你试图把file_generated_inside_the_container (只在你的file_generated_inside_the_container中创build)挂载到主机上的某个位置,就像“反向挂载”一样。

这对任何docker命令来说都是不可能的,但是如果你只是在主机上访问你的VOLUME文件,你可以在docker根目录(通常是/var/lib/docker )中find这些文件。 要find文件的确切位置,可以使用docker inspect [container_id] ,或者在最新版本中使用docker API。

有关更多详细信息,请参阅cpuguy在此github问题中的答案: https : //github.com/docker/docker/issues/12853#issuecomment-123953258 。