V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tw1992
V2EX  ›  Docker

请教一个 dokcer 数据卷的问题

  •  
  •   tw1992 · 2019-11-15 11:34:00 +08:00 · 5297 次点击
    这是一个创建于 1834 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学 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

    10 条回复    2019-12-23 23:29:35 +08:00
    anubu
        1
    anubu  
       2019-11-15 12:03:39 +08:00
    容器启动后,容器内程序会释放文件到 /opt/zbox/。
    FireFoxAhri
        2
    FireFoxAhri  
       2019-11-15 12:56:29 +08:00 via Android
    我发现 postgres 的镜像也是这样,挺方便的
    tw1992
        3
    tw1992  
    OP
       2019-11-15 14:07:46 +08:00
    @FireFoxAhri 确实非常方便
    fishofcat
        4
    fishofcat  
       2019-11-15 14:11:36 +08:00
    这个也是你说的先挂载了,只是文件是后来生成进去的。
    ysoserious
        5
    ysoserious  
       2019-11-15 14:12:28 +08:00
    一些镜像在启动的时候会判断数据文件目录是否为空, 如果是空的, 就认为还没有初始化, 于是执行初始化程序并创建相应的文件.

    如果判断数据文件目录不是空的, 就认为已经初始化过了, 就不再初始化.

    所以你第一次启动的时候挂载了个空的目录进去, 程序判断还没有初始化, 就初始化了.
    tw1992
        6
    tw1992  
    OP
       2019-11-15 14:58:45 +08:00
    @ysoserious 看了 dockerfile,也没看出来
    AstroProfundis
        7
    AstroProfundis  
       2019-11-15 15:07:26 +08:00
    不一定是 dockerfile 里面,你看他程序怎么启动的,可能在启动脚本里面,甚至是那个进程自己干的
    ysoserious
        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 里的文件
    tw1992
        9
    tw1992  
    OP
       2019-11-15 15:45:58 +08:00
    @ysoserious 非常感谢
    hmxxmh
        10
    hmxxmh  
       2019-12-23 23:29:35 +08:00 via Android
    因为你用了–v, 如果是–mount 宿主机目录不存在就不会自动创建
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2736 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:19 · PVG 21:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.