将文件从docker容器公开到主机

将文件从docker容器公开到主机,docker,docker-volume,Docker,Docker Volume,我有一个docker容器,其中包含一个django应用程序。生成静态文件并将其复制到静态文件夹 容器文件夹层次结构: - var - django - app - static 在构建docker映像之前,我运行/manage.py collectstatic,以便静态文件位于/var/django/static文件夹中。为了公开应用程序并提供静态文件,我在主机上安装了一个nginx。问题是,如果我在静态文件夹和主机上的指定文件夹之间创建卷,当我运行do

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

- var
    - django
        - app
        - static

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

卷在docker中被视为挂载,这意味着主机目录将始终挂载在容器的目录上。换句话说,您正在尝试的操作在Docker卷上目前是不可能的

有关此主题的讨论,请参阅本期Github:

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

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

读取:

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

新卷的内容可以由容器预先填充


以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
# mkdir -p /var/nginx
# ln -s /var/lib/docker/volumes/xmpl/_data /var/nginx/static
# ls /var/nginx/static
  50x.html  index.html
最后从/var/nginx/static使用它:

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

为什么不构建一个
nginx
docker映像呢?因此,您在这里要做的是做任何需要的事情来
构建
您的django web应用程序,然后添加(使用dockerfile的
添加
关键字)以将静态文件推送到nginx映像中?因为这就是我们的qa/集成/生产环境的工作方式。nginx在主机上,不在docker上运行。我明白了。因此,您正在考虑将容器的文件装载到主机上,这是非常非传统的做法,因为人们通常采用相反的方式。那么,拥有一个只对其文件感兴趣的容器的目的是什么呢?为什么不只是将静态文件目录符号链接到
ngix
将为其文件提供服务的目录。我的解决方案与您的解决方案非常接近。启动容器并装入卷后,我只运行collectstatic命令,用文件重新填充卷。