关于 docker 挂载文件夹的问题
- 0次
- 2021-06-21 03:54:28
- idczone
目的:将容器内的文件夹挂载到容器外,以便直接编辑容器内文件的方法。
原因:本人在 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,在重新创建容器挂载宿主机配置文件夹,容器成功运行。
有为什么方法可以将容器内的文件夹挂载到容器外吗?
nginx 镜像可以挂载 /etc/nginx/conf.d 目录,直接放 server 级别的配置就行了
你换个思路 把宿主的 mount 给容器 等于你先把容器的 cp 出来 然后再 moubt 就可以编辑了
开 ssh,让我上去看看
起一个 tmp 容器, 然后把容器的文件 docker cp 到本地, 这样你就有一份配置文件了.
只适用于 nginx,其他服务镜像没法用,我又想到了一个办法,将容器内的配置文件夹 软或硬链接到挂载的文件夹里~
这个我试过了,不过觉得有些麻烦,想找个更简单点的办法。比如创建容器时有没有参数可以直接解决这样的问题。
反向思路 docker cp 是正解 出入都可以用他操作, 自己写个脚本即可
你觉得不行的原因是 /etc/nginx 挂载点被宿主给覆盖了, 假如你先挂载再安装 nginx 呢? 又假如你自己 diy 一个 nginx 镜像呢?
我是这样配置的:
-v ./nginx.conf:/etc/nginx/nginx.conf
-v ./conf.d:/etc/nginx/conf.d
只有我没搞明白楼主意图么?
cp 出来然后在 override 自己,这是什么需求啊……
如果只是想要拿出数据。docker cp 难度是什么?
如果是想要覆盖某个文件,那么 -v 也可以细化到具体文件。如果需要只增一个目录,那么可以写个 Dockerfile,然后
FROM nginx
COPY nginx /etc/nginx
楼主搞反了哈,不是把容器的文件夹映射到外面,而是把宿主机的文件夹映射给容器。你这个空的文件夹给容器作为配置文件,容器怎么能正常启动?
学习的时候记得 docker 内部的文件会随着容器关闭而不保存的吧?
把宿主机的磁盘挂载就是方便即时修改容器实例的配置
为什么要把 docker 内部的文件映射到外面呢?
同 8 楼,是把宿主机的文件中挂载到容器中,出现错误可以使用 docker logs 容器 id,通过日志查看相应报错信息
的解释清楚
终于明白楼主不明白在哪里了
volume 的挂载就好像我们物理机器的 mount 一样,把一个虚拟的 device 放到某个路径下,而不是反之。
上面几位没仔细看贴,楼主知道 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 一个镜像。
多谢,虽然感觉这样也太不优雅了,要挂载配置文件得先从 tmp 容器中拷贝...