将文件从Docker容器暴露给主机

Mr *_* T. 6 docker docker-volume

我有一个存放Django应用的Docker容器。生成静态文件并将其复制到静态文件夹。
容器文件夹层次结构:

- var
    - django
        - app
        - static
Run Code Online (Sandbox Code Playgroud)

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

C. *_*eed 8

卷在 Docker 中被视为挂载,这意味着主机目录将始终挂载在容器目录上。换句话说,Docker 卷目前无法实现您正在尝试执行的操作。

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

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


Tyh*_*hal 6

阅读自:Dockers Volume Page

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

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


使用 docker-compose 的类似示例

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

$ docker volume create xmpl
$ docker run -v xmpl:/usr/share/nginx/html nginx
Run Code Online (Sandbox Code Playgroud)

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

$ docker inspect xmpl
...
"Mountpoint": "/var/lib/docker/volumes/xmpl/_data"
Run Code Online (Sandbox Code Playgroud)

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

# ls /var/lib/docker/volumes/xmpl/_data                               
  50x.html  index.html
Run Code Online (Sandbox Code Playgroud)

最后从/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
Run Code Online (Sandbox Code Playgroud)


xno*_*hat 5

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