【问题标题】:Docker: Is it possible to share data between 2 containers without a volume?Docker:是否可以在没有卷的情况下在 2 个容器之间共享数据?
【发布时间】:2023-03-27 21:19:01
【问题描述】:

我有 2 个容器:webnginx。当我构建web 容器时,会在容器内生成前端的静态资产。

现在,我想在不使用主机上的卷的情况下在 webnginx 之间共享这些资产。否则,我将不得不在主机端构建这些静态资产,然后将其作为卷包含到 web 容器中并与 nginx 容器共享。从我的构建系统的角度来看,这是不可取的。

有没有办法在web容器中构建静态资产,然后分享给nginx

【问题讨论】:

    标签: nginx docker docker-compose


    【解决方案1】:

    否则,我将不得不在主机端构建这些静态资产,然后将其作为卷包含到 Web 容器中并与 nginx 容器共享。

    这个说法似乎不正确。

    如果静态资产是作为构建过程的一部分生成的,那么只需在运行时在该目录顶部安装一个卷。 Docker 会负责将底层内容复制到卷中,之后您可以在 nginx 容器中使用 --volumes-from 访问它。

    例如,如果我的 Web 容器以 Dockerfile 开头:

    FROM alpine
    
    RUN apk add --update darkhttpd
    COPY assets /assets
    CMD ["darkhttpd", "/assets"]
    

    我现在有一个目录/assets,其中包含我的静态资产。如果我 将此图像运行为:

    docker run -v /assets --name web web
    

    那么/assets 将 (a) 是一个卷并且 (b) 包含 /assets 目录。

    现在您可以启动一个 nginx 容器并与它共享此数据:

    docker run --volumes-from web nginx
    

    nginx 容器将有一个 /assets 目录,其中包含您的 静态资产。

    我整理了一个小例子here

    【讨论】:

    • 啊,所以我不必将卷映射到主机目录?卷可以独立于主机吗?谢谢你的详细回答,larsks。
    • docs.docker.com/engine/userguide/containers/dockervolumes 是一本关于在 docker 中管理数据的好书。
    • RE:“所以我不必将卷映射到主机的目录?” -> 如果您不挂载主机卷,则删除容器时只会丢失数据。您仍然可以在静态资产容器中挂载本地卷,然后在 nginx 容器上挂载 --volume-from。
    • 这种方法是否意味着应该在构建之间删除带有资产的卷?因为在最初从容器创建卷内容 assets 时,实际上会被复制到新创建的卷中,但是如果新版本的代码包含新的/更改的资产,这些资产将被复制到容器中,这些不会被复制到卷,因为卷已经存在并且卷的内容将替换挂载时容器的内容。
    • 据我所知,由于@ViktorLivakivskyi 提到的原因,这是一个幼稚/不完整的解决方案。换句话说,它只会在web 第一次运行并且永远不会再次运行时起作用。在现实世界中,web 将会有第二个版本。 (不过,我很想被证明是错误的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多