关于 docker 挂载文件夹的问题

2019-02-04 19:01:23 +08:00
 VECH
目的:将容器内的文件夹挂载到容器外,以便直接编辑容器内文件的方法。
原因:本人在 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,在重新创建容器挂载宿主机配置文件夹,容器成功运行。
有为什么方法可以将容器内的文件夹挂载到容器外吗?
9663 次点击
所在节点    Linux
15 条回复
GuryYu
2019-02-04 19:16:29 +08:00
nginx 镜像可以挂载 /etc/nginx/conf.d 目录,直接放 server 级别的配置就行了
wd
2019-02-04 19:18:38 +08:00
你换个思路 把宿主的 mount 给容器 等于你先把容器的 cp 出来 然后再 moubt 就可以编辑了
defunct9
2019-02-04 19:30:09 +08:00
开 ssh,让我上去看看
zuolan
2019-02-04 19:36:33 +08:00
起一个 tmp 容器, 然后把容器的文件 docker cp 到本地, 这样你就有一份配置文件了.
VECH
2019-02-04 19:44:03 +08:00
@GuryYu 只适用于 nginx,其他服务镜像没法用,我又想到了一个办法,将容器内的配置文件夹 软或硬链接到挂载的文件夹里~
@zuolan 这个我试过了,不过觉得有些麻烦,想找个更简单点的办法。比如创建容器时有没有参数可以直接解决这样的问题。
eritpchy
2019-02-04 19:45:24 +08:00
反向思路 docker cp 是正解 出入都可以用他操作, 自己写个脚本即可
eritpchy
2019-02-04 19:47:52 +08:00
你觉得不行的原因是 /etc/nginx 挂载点被宿主给覆盖了, 假如你先挂载再安装 nginx 呢? 又假如你自己 diy 一个 nginx 镜像呢?
zhouzm
2019-02-04 23:56:14 +08:00
我是这样配置的:
-v ./nginx.conf:/etc/nginx/nginx.conf
-v ./conf.d:/etc/nginx/conf.d
yuikns
2019-02-05 00:00:40 +08:00
只有我没搞明白楼主意图么?

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

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

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

volume 的挂载就好像我们物理机器的 mount 一样,把一个虚拟的 device 放到某个路径下,而不是反之。
zhouzm
2019-02-05 09:18:04 +08:00
上面几位没仔细看贴,楼主知道 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
2021-02-25 18:20:39 +08:00
@zhouzm 多谢,虽然感觉这样也太不优雅了,要挂载配置文件得先从 tmp 容器中拷贝...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/532996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX