最近在学 docker,正常将宿主机内目录挂载到容器前,事先把需要挂载目录内的文件创建好,比如 nginx.cnf ,或者先把容器跑起来,doker cp 到宿主机后再挂载到容器。 但是昨天 pull 一个禅道( zentao )的镜像,执行
docker run -d -p 80:80 -p 3306:3306 -e USER="root" -e PASSWD="password" -e BIND_ADDRESS="false" -v /docker/zbox/:/opt/zbox/ --name zentao idoop/zentao:9.8.3
发现容器内 /opt/zbox/下所有的文件和目录都挂载到了宿主机 /docker/zbox/,请教一下大佬们这是这么实现的。
[root@gcjy-dev zbox]# cd /docker/zbox/
[root@gcjy-dev zbox]#
[root@gcjy-dev zbox]#
[root@gcjy-dev zbox]# ll
总用量 16
drwxr-xr-x. 7 1000 1000 82 4 月 8 2018 app
drwxr-xr-x. 2 1000 1000 37 4 月 8 2018 auth
drwxr-xr-x. 2 1000 1000 132 6 月 27 2017 bin
drwxr-xr-x. 3 1000 1000 19 4 月 28 2017 data
drwxr-xr-x. 5 1000 1000 44 4 月 28 2017 etc
drwxrwxrwx. 2 1000 1000 78 4 月 8 2018 logs
-rw-r--r--. 1 1000 1000 281 4 月 28 2017 README
drwxr-xr-x. 6 1000 1000 55 4 月 28 2017 run
drwxrwxrwx. 5 1000 1000 44 4 月 28 2017 tmp
-rwxr-xr-x. 1 1000 1000 90 8 月 21 2017 zbox
-rwxr-xr-x. 1 1000 1000 6564 3 月 26 2018 zbox.php
1
anubu 2019-11-15 12:03:39 +08:00
容器启动后,容器内程序会释放文件到 /opt/zbox/。
|
2
FireFoxAhri 2019-11-15 12:56:29 +08:00 via Android
我发现 postgres 的镜像也是这样,挺方便的
|
3
tw1992 OP @FireFoxAhri 确实非常方便
|
4
fishofcat 2019-11-15 14:11:36 +08:00
这个也是你说的先挂载了,只是文件是后来生成进去的。
|
5
ysoserious 2019-11-15 14:12:28 +08:00
一些镜像在启动的时候会判断数据文件目录是否为空, 如果是空的, 就认为还没有初始化, 于是执行初始化程序并创建相应的文件.
如果判断数据文件目录不是空的, 就认为已经初始化过了, 就不再初始化. 所以你第一次启动的时候挂载了个空的目录进去, 程序判断还没有初始化, 就初始化了. |
6
tw1992 OP @ysoserious 看了 dockerfile,也没看出来
|
7
AstroProfundis 2019-11-15 15:07:26 +08:00
不一定是 dockerfile 里面,你看他程序怎么启动的,可能在启动脚本里面,甚至是那个进程自己干的
|
8
ysoserious 2019-11-15 15:18:54 +08:00
@tw1992 #6
dockerfile 最后一句是 ``` ENTRYPOINT ["docker-entrypoint"] ``` 意思是在容器启动的时候, 在容器中执行 docker-entrypoint 这个脚本, 你可以在 dockerfile 所在目录下找到这个脚本 这个脚本的 11 行~15 行: 如果 /opt/zbox 或者 /opt/zbox/app 目录为空, 执行初始化操作, 把 /tmp/zbox.tar.gz 解压到 /opt 目录下. 于是就有了 /opt/zbox 里的文件 |
9
tw1992 OP @ysoserious 非常感谢
|
10
hmxxmh 2019-12-23 23:29:35 +08:00 via Android
因为你用了–v, 如果是–mount 宿主机目录不存在就不会自动创建
|