我有两个容器。一个用于保存运行 gunicorn 的 django 应用程序,另一个用于保存 celery 任务队列。
Celery 使用相同的 django 应用程序代码库。
当我构建 Django docker 容器时,我使用ADD . /usr/src/app
语句将源文件复制到容器中。但是 Celery 的 Dockerfile 位于另一个文件夹中,因此无法复制其中的文件,因为它们脱离了上下文。
到目前为止我看到两种可能性:
mount -o bind
看起来有点老套- 保留两个文件副本可能会导致不同步的情况
- 将源代码文件夹声明为卷并使用启动 celery 容器
volumes-from
。
目前我使用的是第三种解决方案。有没有更好的方法?git clone
在dockerfile中使用?但是如何进行身份验证...
答案1
在我们当前的docker应用程序中,我们有三个不同的镜像用于两个容器。
- 根据- 它包含所有常见的依赖项(开发标头)以及 Python 源代码。
- 网页- 这将安装特定于 Web 的依赖项,如 Gunicorn。它还会设置
CMD
和端口。 - 工人- 这将安装特定于工作者的依赖项,主要是设置 Celery 用户并将其锁定。
基础镜像位于我们的存储库的根目录,基础镜像的作用相当于ADD . /usr/src/app
其他镜像。Web 镜像和 Worker 镜像都从基础镜像扩展而来,因此它们也都具有源代码。
这使得您可以在两个容器之间共享代码,而不需要另一个保存代码的卷。
这三个 Dockerfile 的示例设置如下
./Dockerfile
FROM python:3.4
ADD . /usr/src/app
RUN pip install -r /usr/src/app/requirements.txt
./web/Dockerfile
FROM app-base:latest
RUN pip install gunicorn
./worker/Dockerfile
FROM app-base:latest
RUN pip install celery
然后需要将其构建为
docker build -t app-base .
docker build -t app-web web
docker build -t app-worker worker
这不适用于docker compose因为它不支持形象传承。
答案2
我原来的答案仍然是该问题的有效解决方案,但从 Docker 1.6.0 开始,现在存在另一种解决方案。您现在可以指定的位置Dockerfile
,并且它不必与构建上下文的根目录位于同一目录中。
./Dockerfile.web
FROM python:3.4
ADD . /usr/src/app
RUN pip install gunicorn
./Dockerfile.worker
FROM python:3.4
ADD . /usr/src/app
RUN pip install celery
建议将ADD
各行保留在顶部Dockerfile
,这样只需添加一次,即可重复用于构建 Web 和工作者图像。
您可以构建图像作为
docker build -t app-web -f Dockerfile.web .
docker build -t app-worker -f Dockerfile.worker .
或者使用Docker 组成,配置如下
services:
web:
build:
context: .
dockerfile: Dockerfile.web
worker:
build:
context: .
dockerfile: Dockerfile.worker