我有两个容器 一个用于持枪我跑django应用程序运行,另一个是芹菜任务队列。
Celery使用相同的django应用程序代码库。
当我构buildDjango docker容器时,我使用ADD . /usr/src/app ADD . /usr/src/app语句将源文件复制到容器中。 但是,Celery的Dockerfile放置在另一个文件夹中,因此不可能在文件不存在的情况下复制文件。
到目前为止我看到两种可能性:
mount -o bind似乎看起来很乱 volumes-from启动芹菜容器。 目前我使用第三种解决scheme。 有没有更好的方法? 在dockerfile中使用git clone ? 但是,如何validation然后…
在我们当前的泊坞窗应用程序中,我们有三个不同的图像用于两个容器。
CMD和端口。 基本映像位于我们的存储库的根目录,我们的基本映像与ADD . /usr/src/app ADD . /usr/src/app以及一些其他的东西。 web和worker图像都是从这个基本图像扩展而来的,所以它们都有源代码。
这允许您在两个容器之间共享代码,并且不要求您拥有另一个容纳代码的卷。
三个Dockerfiles的示例设置将是
./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
这将需要build立为
docker build -t app-base . docker build -t app-web web docker build -t app-worker worker
这不会与docker组合,因为它不支持图像的inheritance 。
我原来的答案仍然是解决问题的有效方法,但Docker 1.6.0现在还存在另一个解决scheme。 您现在可以指定Dockerfile的位置,并且不必与构build上下文的根位于相同的目录中。
./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
build议将ADD行保留在Dockerfile的顶部,因此只需要添加一次,并且可以重复使用它来构buildWeb和Worker图像。
你可以build立图像
docker build -t app-web -f Dockerfile.web . docker build -t app-worker -f Dockerfile.worker .
或者使用Docker Compose ,configuration将如下所示
services: web: build: context: . dockerfile: Dockerfile.web worker: build: context: . dockerfile: Dockerfile.worker