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

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

  •  
  •   jiayouzl · 186 天前 · 1357 次点击
    这是一个创建于 186 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    15 条回复    2023-10-26 13:27:29 +08:00
    listenfree
        1
    listenfree  
       186 天前
    把挂载点路径,写进环境变量,传给 docker start ,不知道我理解你的意思没?
    listenfree
        2
    listenfree  
       186 天前
    下面是 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
        3
    XiLingHost  
       186 天前
    @listenfree chatgpt 在瞎说,这个实际上还是 recreate 了容器,你只要改变了容器的元数据就一定会重新创建容器
    XiLingHost
        4
    XiLingHost  
       186 天前
    你其实是希望容器不要被重新创建以致于丢失未被持久化的内容吗?
    这不是容器化方案的最佳实践,一般来说需要持久化的内容都应当被挂载为卷,无论是 bind 方式还是 volume 方式
    有个 workaround 是,你可以挂载一个目录进去,然后通过 mount --bind 方式把其他的挂载点挂载到这个已经挂载到容器内的目录里来实现动态挂载卷
    Donahue
        5
    Donahue  
       186 天前
    宿主机直接软链接到已经挂载的文件夹可行吗
    jiayouzl
        6
    jiayouzl  
    OP
       186 天前
    @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
        7
    jiayouzl  
    OP
       186 天前
    @listenfree 你的意思我在.bash_profile 写挂载点的路径地址,然后通过容器去读环境变量?这个 yml 或者 docker run 的时候要怎么写-v 的参数?
    CEBBCAT
        8
    CEBBCAT  
       186 天前
    @listenfree #2 AI 生成内容有一定几率导致自己被 ban ,可以搜索站内相关关键字和「关于」页面,祝好运
    XiLingHost
        9
    XiLingHost  
       186 天前   ❤️ 1
    @jiayouzl 这个情况估计也只能曲线救国,尝试把这些静态文件挂载到一个特定的目录然后把整个目录挂载到你的 Nginx Proxy Manager 容器里了
    不过为啥不把这些静态文件专门挂载到一个单独的 nginx 容器里呢?
    jiayouzl
        10
    jiayouzl  
    OP
       186 天前
    @XiLingHost 哈哈哈哈,你这个方法就是我最初的方法,成熟项目还好点,新项目静态资源经常有改动就得老拷贝来拷贝去的,不过实在没办法也就只能这样了.
    XiLingHost
        11
    XiLingHost  
       186 天前
    @jiayouzl 其实我是觉得你们可以考虑把静态资源直接构建成一个前端镜像,然后 nginx 只需要配置代理到这个容器就行了
    如果是这种做法可以考虑这个镜像
    https://hub.docker.com/r/nginxproxy/nginx-proxy
    jiayouzl
        12
    jiayouzl  
    OP
       186 天前
    @XiLingHost 谢了,我这就看下.
    yinmin
        13
    yinmin  
       186 天前 via iPhone
    @listenfree chatgpt 给出的答案是错误的。

    @jiayouzl 90%的 Django 项目,静态资源可以直接放在 Django 项目里。除非是高并发项目,否则别分离出来给 nginx 。用 docker 的单机项目,大都数情况也不太会是高并发项目吧。
    yinmin
        14
    yinmin  
       186 天前 via iPhone
    @jiayouzl 别听开发 GGYY ,说是静态资源从 Django 分离出来,直接 nginx 访问能大幅提高性能之类的。除非他的项目是高并发,否则一律放 Django 里,别折腾。
    jiayouzl
        15
    jiayouzl  
    OP
       185 天前
    @yinmin 我懂你意思了,你的意思我直接 Django+ Gunicorn+WhiteNoise 部署,然后 nginx 只负责反向代理+HTTPS 功能是吧.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1219 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:00 · PVG 02:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.