编辑:我不再使用docker了,所以我无法测试这个问题的答案
感谢大家的建议!
TL; DR:你能指点一个简单的图像示例,它将更改写入容器和主机文件系统之间共享的卷吗?
嗨,
我无法理解卷的工作原理 .
我已经阅读了Dockerfile reference以及understanding volumes
我正在尝试做什么
-
我有一个图像,使作曲家在RUN上安装wordpress到/ var / tmp / html
-
然后ONBUILD我使用docker-compose.yml环境变量中的一些信息对/ var / tmp / html进行更多操作
-
作为最后一步,我希望将所有内容复制到/ var / www / html并让它从作曲家(能够运行指向这些文件的apache)和本地文件系统(我将代码编写到此html目录)中使用它)
我现在拥有什么
测试1
上面的链接是指向这些文件的github上特定版本的链接
这个测试只是安装wordpress而没有任何音量信息的一切
结果
抨击图像并列出/ var / www / html
我明白了:
root@4484ccdb63ca:/var/www/html# ls -al
total 32
drwxr-xr-x 6 www-data www-data 4096 Jan 21 11:45 .
drwxr-xr-x 6 root root 4096 Jan 21 11:45 ..
-rw-r--r-- 1 www-data www-data 10 Jan 21 10:47 .gitignore
-rw-r--r-- 1 www-data www-data 138 Jan 21 10:47 composer.json
-rw-r--r-- 1 www-data www-data 3718 Jan 21 10:47 composer.lock
-rw-r--r-- 1 www-data www-data 428 Jan 21 10:47 index.php
drwxr-xr-x 6 www-data www-data 4096 Jan 21 11:45 vendor
drwxr-xr-x 8 www-data www-data 4096 Jan 21 11:45 wordpress
这是 ok
并在我得到的本地文件系统上列出./html
total 0
drwxr-xr-x 3 miqueladell staff 102 Jan 21 10:33 .
drwxr-xr-x 11 miqueladell staff 374 Jan 21 13:04 ..
-rw-r--r-- 1 miqueladell staff 0 Jan 21 10:33 foo
这是 wrong 但完全可以预料到 . 容器上的文件正常,但在容器外没有任何操作,因为我没有提供任何卷信息 .
测试2
上面的链接是指向这些文件的github上特定版本的链接
在Dockerfile和docker-compose.yml上添加了VOLUME
这是差异的粘贴
Dockerfile
- # VOLUME /var/www/html/
+ VOLUME /var/www/html/
docker-compose.yml
- # volumes:
- # - .html:/var/www/html/
+ volumes:
+ - ./html:/var/www/html/
构建映像和运行cointainer的结果是空的容器上的空html目录,并且没有更改本地文件系统
谢谢!
EDIT: 我创建了这个问题的最小失败版本:How to get contents generated by a docker container on the local fileystem (minimal failing example)
3 回答
卷的功能类似于挂载点,因此在挂载卷时,挂载点的内容是到达容器的内容 .
正如this (simplified) question中所回答的那样,解决方案是对挂载卷执行操作,该挂载点将在挂载卷后执行 .
查看Dockerfile和docker-compose.yml文件的第2版,我建议进行以下编辑:
Dockerfile
70号线附近:改变
至
WORKDIR
设置正在运行的脚本的默认路径(以及登录容器时) .在您的第一个示例中,您正在使用rsync将
/tmp/html
的内容有效地复制到自身,然后再将该目录存入bin . 此外,此目录不会暴露在容器外部 .通过上述更改,您将
/tmp/html
的内容复制到/var/www/html
,然后将其暴露在容器外部,然后使用docker-compose文件映射到本地计算机 .Docker-compose.yml
请尝试以下文件:
我认为你对
VOLUME
中的VOLUME
以及运行Docker容器时-v
的作用有一点误解 .VOLUME
和-v之间的根本区别在于:-v将在您的docker容器中挂载操作系统中的现有文件,VOLUME
将在您的主机上创建一个新的空卷(存储在/ var / lib / docker / xxxxx中)和将它安装在容器内 .例:
我们在/ home / test /中有一个文件测试文件
我们想在docker容器中挂载这个目录,所以当我们更改主机上的文件时,它会在容器内部发生变化 .
这就是您目前正在做的事情(在
/home/test
处在容器内创建一个空的VOLUME
):Dockerfile
构建此映像并从中运行容器:
当你
docker run
时,你真正想要做的是使用-v
:Dockerfile
构建此映像并从中运行容器:
Edit
糟糕,我认为您上面的实际问题是
docker-compose.yml
文件中的volume:
声明中没有完整路径 .例:
docker-compose.yml(注意
.home
不存在)然后:
但是如果你把完整的路径:
泊坞窗,compose.yml:
然后: