我有两个容器。一个用于保存运行 gunicorn 的 django 应用程序,另一个用于 celery 任务队列。
Celery 使用相同的 django 应用程序代码库。
当我构建 Django docker 容器时,我使用ADD . /usr/src/app语句将源文件复制到容器中。但是 Dockerfile for Celery 位于另一个文件夹中,因此无法复制其中的文件,因为它们与上下文无关。
到目前为止,我看到了两种可能性:
mount -o bind 似乎看起来很hackyvolumes-from.目前我使用第三种解决方案。有没有更好的方法?git clone在 dockerfile 中使用?但是如何进行身份验证...
在我们当前的 docker 应用程序中,我们有三个不同的镜像用于两个容器。
CMD和 端口。基本映像位于我们存储库的根目录中,我们的基本映像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
Run Code Online (Sandbox Code Playgroud)
./web/Dockerfile
FROM app-base:latest
RUN pip install gunicorn
Run Code Online (Sandbox Code Playgroud)
./工人/Dockerfile
FROM app-base:latest
RUN pip install celery
Run Code Online (Sandbox Code Playgroud)
然后需要将其构建为
docker build -t app-base .
docker build -t app-web web
docker build -t app-worker worker
Run Code Online (Sandbox Code Playgroud)
这不适用于docker compose,因为它不支持图像继承。
我最初的答案仍然是该问题的有效解决方案,但从 Docker 1.6.0 开始,现在存在另一个解决方案。您现在可以指定 的位置Dockerfile,并且它不必与构建上下文的根目录位于同一目录中。
./Dockerfile.web
FROM python:3.4
ADD . /usr/src/app
RUN pip install gunicorn
Run Code Online (Sandbox Code Playgroud)
./Dockerfile.worker
FROM python:3.4
ADD . /usr/src/app
RUN pip install celery
Run Code Online (Sandbox Code Playgroud)
建议将这些ADD行保留在. 的顶部Dockerfile,这样添加只需要发生一次,并且可以重复用于构建 web 和 worker 图像。
您可以将图像构建为
docker build -t app-web -f Dockerfile.web .
docker build -t app-worker -f Dockerfile.worker .
Run Code Online (Sandbox Code Playgroud)
或者使用Docker Compose,配置看起来像
services:
web:
build:
context: .
dockerfile: Dockerfile.web
worker:
build:
context: .
dockerfile: Dockerfile.worker
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6984 次 |
| 最近记录: |