请教一个 docker 问题谢谢大家~

201 天前
 jiayouzl

我有个容器,经常需要增加挂载新目录(volumes)现在一直是删除容器后,修改.yml 文件新建一个新的容器,请问有没有什么版本可以实现停止容器后,新增挂载点后通过 docker start 启动的办法?谢谢,查了一圈都没好答案.

1380 次点击
所在节点    Docker
15 条回复
listenfree
201 天前
把挂载点路径,写进环境变量,传给 docker start ,不知道我理解你的意思没?
listenfree
201 天前
下面是 chatgpt 的理解:
对于已经运行的容器,如果需要新增挂载点( volumes ),您可以使用 Docker 的 docker volume create 命令来创建一个独立的数据卷,并将其挂载到已经停止的容器上。这样,在启动容器时就会自动加载新的挂载点。

以下是一些步骤来实现这个目标:

停止正在运行的容器:
shell

docker stop <container_name>
```

创建新的数据卷:
shell

docker volume create <volume_name>
```

将新的数据卷挂载到容器上:
shell

docker run -d --name <new_container_name> -v <volume_name>:<mount_path> <image_name>
```

其中,`<volume_name>`是步骤 2 中创建的数据卷的名称,`<mount_path>`是您希望将数据卷挂载到容器中的路径,`<image_name>`是容器的镜像名称。

启动新的容器:
shell

docker start <new_container_name>
```

通过这种方式,您可以在停止容器后新增挂载点,并在启动容器时自动加载新的挂载点,而无需删除和重新创建容器。

请注意,这种方法适用于单个容器。如果您使用 Docker Compose 或编排工具来管理多个容器,您可能需要相应地调整配置文件来包含新的挂载点。
XiLingHost
201 天前
@listenfree chatgpt 在瞎说,这个实际上还是 recreate 了容器,你只要改变了容器的元数据就一定会重新创建容器
XiLingHost
201 天前
你其实是希望容器不要被重新创建以致于丢失未被持久化的内容吗?
这不是容器化方案的最佳实践,一般来说需要持久化的内容都应当被挂载为卷,无论是 bind 方式还是 volume 方式
有个 workaround 是,你可以挂载一个目录进去,然后通过 mount --bind 方式把其他的挂载点挂载到这个已经挂载到容器内的目录里来实现动态挂载卷
Donahue
201 天前
宿主机直接软链接到已经挂载的文件夹可行吗
jiayouzl
201 天前
@XiLingHost 我是用的 Nginx Proxy Manager 做反向代理+一些其他需要的功能,反向代理 Django 项目的时候需要 nginx 托管静态文件,上一个新的 Django 项目就要重新挂载一个新的 Django 项目的静态文件目录到 Nginx Proxy Manager 容器里去.一些非持久化的数据到到不是特别重要,最烦的就是 Nginx Proxy Manager 也是基于 Python 开发的,我用 HTTPS 证书是通过阿里云的 Key 去管理的,Nginx Proxy Manager 容器本身用的 pip 镜像还是国外的,国内云服务器下载国外镜像的速度与错误率你肯定也知道的,主要是重建一个新容器的时候老是失败,导致其他项目也会崩.

所以我想有没有什么办法在不删除容器新建一个 Nginx Proxy Manager 容器的前提下,新增一个挂载卷,stop 容器没事的,毕竟 docker 启动还是很快的.
jiayouzl
201 天前
@listenfree 你的意思我在.bash_profile 写挂载点的路径地址,然后通过容器去读环境变量?这个 yml 或者 docker run 的时候要怎么写-v 的参数?
CEBBCAT
201 天前
@listenfree #2 AI 生成内容有一定几率导致自己被 ban ,可以搜索站内相关关键字和「关于」页面,祝好运
XiLingHost
201 天前
@jiayouzl 这个情况估计也只能曲线救国,尝试把这些静态文件挂载到一个特定的目录然后把整个目录挂载到你的 Nginx Proxy Manager 容器里了
不过为啥不把这些静态文件专门挂载到一个单独的 nginx 容器里呢?
jiayouzl
201 天前
@XiLingHost 哈哈哈哈,你这个方法就是我最初的方法,成熟项目还好点,新项目静态资源经常有改动就得老拷贝来拷贝去的,不过实在没办法也就只能这样了.
XiLingHost
201 天前
@jiayouzl 其实我是觉得你们可以考虑把静态资源直接构建成一个前端镜像,然后 nginx 只需要配置代理到这个容器就行了
如果是这种做法可以考虑这个镜像
https://hub.docker.com/r/nginxproxy/nginx-proxy
jiayouzl
201 天前
@XiLingHost 谢了,我这就看下.
yinmin
201 天前
@listenfree chatgpt 给出的答案是错误的。

@jiayouzl 90%的 Django 项目,静态资源可以直接放在 Django 项目里。除非是高并发项目,否则别分离出来给 nginx 。用 docker 的单机项目,大都数情况也不太会是高并发项目吧。
yinmin
201 天前
@jiayouzl 别听开发 GGYY ,说是静态资源从 Django 分离出来,直接 nginx 访问能大幅提高性能之类的。除非他的项目是高并发,否则一律放 Django 里,别折腾。
jiayouzl
200 天前
@yinmin 我懂你意思了,你的意思我直接 Django+ Gunicorn+WhiteNoise 部署,然后 nginx 只负责反向代理+HTTPS 功能是吧.

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

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

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

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

© 2021 V2EX