在Docker容器之间共享代码库

我有两个容器 一个用于持枪我跑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然后…

在我们当前的泊坞窗应用程序中,我们有三个不同的图像用于两个容器。

  • 基础 – 这是什么包含任何常见的依赖项(开发标题),以及Python的源代码。
  • networking – 这将安装networking特定的依赖关系,如Gunicorn。 它还设置了CMD和端口。
  • 工人 – 这将安装特定于工作人员的依赖项,主要是设置Celery用户并将其locking。

基本映像位于我们的存储库的根目录,我们的基本映像与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