12

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

- var
    - django
        - app
        - static

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

4

3 回答 3

8

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

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

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

于 2016-08-14T21:11:29.770 回答
5

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

于 2017-01-28T21:15:47.257 回答
3

阅读自:Dockers 卷页

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

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


使用 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
于 2019-12-17T21:27:59.943 回答