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

时间:2016-01-21 14:49:59

标签: docker filesystems dockerfile docker-compose

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

How to get contents generated by a docker container on the local fileystem

我有以下文件:

./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

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

构建图片

$ 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

来自本地文件系统的卷将安装在容器文件系统上,替换它的内容。

这与我在“#34;权限和所有权”一节中所理解的情况相反。本指南Understanding volumes

我怎样才能获得所需的输出?

由于

编辑:正如在接受的答案中所说,我在提问时并不理解卷。卷,作为mountponint,将容器内容替换为已挂载的本地文件系统。

我需要的解决方案是在容器运行后使用ENTRYPOINT运行必要的命令来初始化已安装卷的内容。

可以看到发起问题的代码在这里工作: https://github.com/MiquelAdell/composed_wordpress/tree/1.0.0

2 个答案:

答案 0 :(得分:1)

这是你指出的指南

  

如果为卷指定主机目录

,则不会发生这种情况

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

如果您需要将某些文件添加到卷,则应在启动容器之后执行此操作。例如,您可以执行touch的入口点,然后运行主进程。

答案 1 :(得分:0)

是的,非常确定它应该是完整的路径:

搬运工-compose.yml

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

./html应为/path/to/html

修改

更改为完整路径并运行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(仅在您的docker镜像中创建)安装到主机上的某个位置 - 就像“反向安装”一样。

这不可能与任何docker命令一起使用,但如果您所有人都访问了主机上的VOLUME文件,则可以在docker根目录中找到这些文件(通常{ {1}})。要查找文件的确切位置,您可以使用/var/lib/docker,或者在最新版本中使用docker API。

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