"docker-compose run" 命令后音量变化不持久(Django 的 collectstatic)
Volume changes not persistent after "docker-compose run" command (Django's collectstatic)
我有一个使用 Docker Compose 创建的 Django 环境,我正在尝试使用 manage.py collectstatic
将我站点的静态文件复制到容器中的目录。该目录 (/usr/src/app/static) 也是一个 Docker 卷。
构建我的 docker 容器 (docker-compose build
) 后,我 运行 docker-compose run web python manage.py collectstatic
按预期工作,但我的网络服务器 (Nginx) 没有找到文件,当我 运行 docker-compose run web ls -la /usr/src/app/static
.
时也没有任何文件
对我做错了什么有什么想法吗?
(注意:我的 Docker 文件中没有 manage.py collectstatic
,因为我的设置需要加载我的“.env”文件,但我没有看到加载它的方法Docker 文件。在任何一种情况下,我都想知道为什么 Docker Compose 不能像我期望的那样工作。)
这是我的配置文件:
## docker-compose.yml:
web:
restart: always
build: .
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app/static
- .:/code
env_file: .env
command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload
nginx:
restart: always
build: ./config/nginx
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
postgres:
restart: always
image: postgres:latest
volumes:
- /var/lib/postgresql
ports:
- "5432:5432"
## Dockerfile:
FROM python:3.4.3
RUN mkdir /code
WORKDIR /code
ADD . /requirements/ /code/requirements/
RUN pip install -r /code/requirements/docker.txt
ADD . /code/
运行 docker-compose run ...
启动一个新容器并在其中执行命令。然后当你 运行 docker-compose up
它会创建另一个新容器......它没有你之前命令的变化。
您要做的是启动一个数据容器来保存您的静态文件。像这样将另一个容器添加到您的撰写文件中...
web-static:
build: .
volumes:
- /usr/src/app/static
env_file: .env
command: manage.py collectstatic
并将 web-static 添加到 nginx 容器的 'volumes-from' 列表中
除了 Paul Becotte 的方法之外,还有其他几种方法可以做到这一点:
一个。随着 docker-compose v 1.6 的发布(Paul 回答时不可用),您现在可以使用 docker-compose 文件版本 2 来指定卷
version: '2'
volumes:
django-static:
driver: local
django:
...
volumes:
- django-static:/usr/src/app/static
然后您可以将静态文件收集到一个单独的容器中,它们将持久存在
docker-compose run django ./manage.py collectstatic
与 Pauls 的方法相比,使用此方法的系统开销应该更少,因为您 运行 少了一个容器。
乙。小 hack - 你可以在容器命令中收集静态文件
django:
command: bash -c "./manage.py collectstatic --noinput;
/usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload"
这样做的缺点是,如果您从 docker-compose 命令行调用不同的命令,那么它是不灵活的,那么 collectstatic 将不会得到 运行。此外,您 运行 有时可能不需要收集静态文件。
我有一个使用 Docker Compose 创建的 Django 环境,我正在尝试使用 manage.py collectstatic
将我站点的静态文件复制到容器中的目录。该目录 (/usr/src/app/static) 也是一个 Docker 卷。
构建我的 docker 容器 (docker-compose build
) 后,我 运行 docker-compose run web python manage.py collectstatic
按预期工作,但我的网络服务器 (Nginx) 没有找到文件,当我 运行 docker-compose run web ls -la /usr/src/app/static
.
对我做错了什么有什么想法吗?
(注意:我的 Docker 文件中没有 manage.py collectstatic
,因为我的设置需要加载我的“.env”文件,但我没有看到加载它的方法Docker 文件。在任何一种情况下,我都想知道为什么 Docker Compose 不能像我期望的那样工作。)
这是我的配置文件:
## docker-compose.yml:
web:
restart: always
build: .
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app/static
- .:/code
env_file: .env
command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload
nginx:
restart: always
build: ./config/nginx
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
postgres:
restart: always
image: postgres:latest
volumes:
- /var/lib/postgresql
ports:
- "5432:5432"
## Dockerfile:
FROM python:3.4.3
RUN mkdir /code
WORKDIR /code
ADD . /requirements/ /code/requirements/
RUN pip install -r /code/requirements/docker.txt
ADD . /code/
运行 docker-compose run ...
启动一个新容器并在其中执行命令。然后当你 运行 docker-compose up
它会创建另一个新容器......它没有你之前命令的变化。
您要做的是启动一个数据容器来保存您的静态文件。像这样将另一个容器添加到您的撰写文件中...
web-static:
build: .
volumes:
- /usr/src/app/static
env_file: .env
command: manage.py collectstatic
并将 web-static 添加到 nginx 容器的 'volumes-from' 列表中
除了 Paul Becotte 的方法之外,还有其他几种方法可以做到这一点:
一个。随着 docker-compose v 1.6 的发布(Paul 回答时不可用),您现在可以使用 docker-compose 文件版本 2 来指定卷
version: '2'
volumes:
django-static:
driver: local
django:
...
volumes:
- django-static:/usr/src/app/static
然后您可以将静态文件收集到一个单独的容器中,它们将持久存在
docker-compose run django ./manage.py collectstatic
与 Pauls 的方法相比,使用此方法的系统开销应该更少,因为您 运行 少了一个容器。
乙。小 hack - 你可以在容器命令中收集静态文件
django:
command: bash -c "./manage.py collectstatic --noinput;
/usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload"
这样做的缺点是,如果您从 docker-compose 命令行调用不同的命令,那么它是不灵活的,那么 collectstatic 将不会得到 运行。此外,您 运行 有时可能不需要收集静态文件。