【问题标题】:expose files from docker container to host将文件从 docker 容器公开到主机
【发布时间】:2016-12-20 19:35:44
【问题描述】:

我有一个包含 django 应用程序的 docker 容器。生成静态文件并将其复制到静态文件夹。
容器文件夹层次结构:

- var
    - django
        - app
        - static

在构建 docker 映像之前,我运行 ./manage.py collectstatic,因此静态文件位于 /var/django/static 文件夹中。为了公开应用程序并提供静态文件,我在主机上有一个 nginx。问题是,如果我在主机上的静态文件夹和指定文件夹之间创建一个卷,当我运行 docker 容器时,容器中的 /var/django/static 文件夹会被删除(嗯,不是删除而是挂载)。有什么办法可以克服这个吗?如设置音量但告诉 docker 也获取当前文件?

【问题讨论】:

  • 为什么不构建一个nginx docker 镜像呢?因此,您在这里要做的就是对您的 django Web 应用程序执行build 所需的任何操作,然后添加(使用 dockerfile 的 ADD 关键字)将静态文件推送到 nginx 映像中?
  • 因为这就是我们的 QA/集成/生产环境的工作方式。 nginx 在主机上,不在 docker 上运行。
  • 我明白了。因此,您正在考虑将容器的文件挂载到主机上,这非常不合常规,因为人们通常以相反的方式进行操作。那么拥有一个只对文件感兴趣的容器的目的是什么?为什么不将静态文件目录符号链接到ngix 将为其文件提供服务的目录。

标签: docker docker-volume


【解决方案1】:

卷在 Docker 中被视为挂载,这意味着主机目录将始终挂载在容器的目录之上。换句话说,您当前尝试做的事情对于 Docker 卷是不可能的。

有关此主题的讨论,请参阅此 Github 问题:https://github.com/docker/docker/issues/4361

一种可能的解决方法是将 docker 卷放在容器中的空目录中,然后在 Docker RUN 命令(或启动脚本)中,将静态内容复制到挂载为的空目录中一卷。

【讨论】:

  • 我的解决方案和你的很接近。在我启动容器并安装卷之后,我只运行了另一个 collectstatic 命令,它用文件重新填充了卷。
  • 澄清一下,您是说可以在构建过程中通过执行复制来解决此问题,从而自动解决此问题?你是说 Dockerfile COPY 命令吗?还是使用运行“cp /files1 /files2”?事后我可以通过在容器中执行命令来填充挂载的目录,但这感觉像是一个不必要且可以避免的手动步骤。
【解决方案2】:

另一个不错的解决方案: 1.安装SSHd 2.在主机上安装SSHFS 3.通过SSHFS将docker容器内的文件夹挂载到外部(主机)

【讨论】:

    【解决方案3】:

    阅读自:Dockers Volume Page

    与绑定挂载相比,卷有几个优点:

    新卷可以通过容器预先填充其内容。


    Similar example using docker-compose

    以nginx的默认网页文件夹为例:

    $ docker volume create xmpl
    $ docker run -v xmpl:/usr/share/nginx/html nginx
    

    将通过以下方式生成主机系统上的所有文件:

    $ docker inspect xmpl
    ...
    "Mountpoint": "/var/lib/docker/volumes/xmpl/_data"
    

    然后您可以查看主机上的文件:

    # ls /var/lib/docker/volumes/xmpl/_data                               
      50x.html  index.html
    

    最后从 /var/nginx/static 使用它:

    # mkdir -p /var/nginx
    # ln -s /var/lib/docker/volumes/xmpl/_data /var/nginx/static
    # ls /var/nginx/static
      50x.html  index.html
    

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2014-05-19
      相关资源
      最近更新 更多