V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
VECH
V2EX  ›  Linux

关于 docker 挂载文件夹的问题

  •  
  •   VECH · 2019-02-04 19:01:23 +08:00 · 9853 次点击
    这是一个创建于 2119 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目的:将容器内的文件夹挂载到容器外,以便直接编辑容器内文件的方法。
    原因:本人在 debian 9.7 上使用 docker 下载 nginx 官方镜像并创建了一个 nginx 容器。创建容器时,为了方便修改 nginx 配置文件,将宿主机的一个空文件夹“/etc/nginx ”,挂载为容器中 nginx 的配置文件夹,创建容器的命令中指定了如下参数“-v /etc/nginx:/etc/nginx ”。结果容器无法启动,排查后发现宿主机 “/etc/nginx ” 配置文件夹是空的,导致 nginx 无法启动,容器退出。原因可能是“-v /etc/nginx:/etc/nginx ”参数挂载目录只是将宿主机的文件夹代替了容器内的文件夹,导致 nginx 没有了配置文件。
    然后本人尝试先不挂载文件夹,创建容器 test1 使用"docker cp "命令将容器 test1 内的 nginx 配置文件夹拷贝到宿主机内“/etc/nginx ”,删除容器 test1,在重新创建容器挂载宿主机配置文件夹,容器成功运行。
    有为什么方法可以将容器内的文件夹挂载到容器外吗?
    15 条回复    2021-02-25 18:20:39 +08:00
    GuryYu
        1
    GuryYu  
       2019-02-04 19:16:29 +08:00 via iPad
    nginx 镜像可以挂载 /etc/nginx/conf.d 目录,直接放 server 级别的配置就行了
    wd
        2
    wd  
       2019-02-04 19:18:38 +08:00 via iPhone
    你换个思路 把宿主的 mount 给容器 等于你先把容器的 cp 出来 然后再 moubt 就可以编辑了
    defunct9
        3
    defunct9  
       2019-02-04 19:30:09 +08:00 via iPhone
    开 ssh,让我上去看看
    zuolan
        4
    zuolan  
       2019-02-04 19:36:33 +08:00
    起一个 tmp 容器, 然后把容器的文件 docker cp 到本地, 这样你就有一份配置文件了.
    VECH
        5
    VECH  
    OP
       2019-02-04 19:44:03 +08:00
    @GuryYu 只适用于 nginx,其他服务镜像没法用,我又想到了一个办法,将容器内的配置文件夹 软或硬链接到挂载的文件夹里~
    @zuolan 这个我试过了,不过觉得有些麻烦,想找个更简单点的办法。比如创建容器时有没有参数可以直接解决这样的问题。
    eritpchy
        6
    eritpchy  
       2019-02-04 19:45:24 +08:00 via Android
    反向思路 docker cp 是正解 出入都可以用他操作, 自己写个脚本即可
    eritpchy
        7
    eritpchy  
       2019-02-04 19:47:52 +08:00 via Android
    你觉得不行的原因是 /etc/nginx 挂载点被宿主给覆盖了, 假如你先挂载再安装 nginx 呢? 又假如你自己 diy 一个 nginx 镜像呢?
    zhouzm
        8
    zhouzm  
       2019-02-04 23:56:14 +08:00
    我是这样配置的:
    -v ./nginx.conf:/etc/nginx/nginx.conf
    -v ./conf.d:/etc/nginx/conf.d
    yuikns
        9
    yuikns  
       2019-02-05 00:00:40 +08:00 via iPhone
    只有我没搞明白楼主意图么?

    cp 出来然后在 override 自己,这是什么需求啊……

    如果只是想要拿出数据。docker cp 难度是什么?
    如果是想要覆盖某个文件,那么 -v 也可以细化到具体文件。如果需要只增一个目录,那么可以写个 Dockerfile,然后
    FROM nginx
    COPY nginx /etc/nginx
    xuanbg
        10
    xuanbg  
       2019-02-05 00:23:17 +08:00
    楼主搞反了哈,不是把容器的文件夹映射到外面,而是把宿主机的文件夹映射给容器。你这个空的文件夹给容器作为配置文件,容器怎么能正常启动?
    soyoker
        11
    soyoker  
       2019-02-05 01:13:21 +08:00
    学习的时候记得 docker 内部的文件会随着容器关闭而不保存的吧?
    把宿主机的磁盘挂载就是方便即时修改容器实例的配置
    为什么要把 docker 内部的文件映射到外面呢?
    keji
        12
    keji  
       2019-02-05 01:34:38 +08:00 via Android
    同 8 楼,是把宿主机的文件中挂载到容器中,出现错误可以使用 docker logs 容器 id,通过日志查看相应报错信息
    yuikns
        13
    yuikns  
       2019-02-05 02:49:39 +08:00 via iPhone   ❤️ 1
    @xuanbg #10 的解释清楚

    终于明白楼主不明白在哪里了

    volume 的挂载就好像我们物理机器的 mount 一样,把一个虚拟的 device 放到某个路径下,而不是反之。
    zhouzm
        14
    zhouzm  
       2019-02-05 09:18:04 +08:00 via Android   ❤️ 1
    上面几位没仔细看贴,楼主知道 mount 怎么用,他的目的是想 docker 自定义配置目录时方便的得到 nginx 的 默认配置。

    我看了一下 nginx 官方 docker 的帮助,推荐的做法就是使用 docker cp:
    $ docker run --name tmp-nginx-container -d nginx
    $ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
    $ docker rm -f tmp-nginx-container

    或者写个 Dockerfile,自己 build 一个镜像。
    chrisia
        15
    chrisia  
       2021-02-25 18:20:39 +08:00
    @zhouzm 多谢,虽然感觉这样也太不优雅了,要挂载配置文件得先从 tmp 容器中拷贝...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:46 · PVG 03:46 · LAX 11:46 · JFK 14:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.