在 docker 容器之间共享代码库

Glu*_*eon 7 docker

我有两个容器。一个用于保存运行 gunicorn 的 django 应用程序,另一个用于 celery 任务队列。

Celery 使用相同的 django 应用程序代码库。

当我构建 Django docker 容器时,我使用ADD . /usr/src/app语句将源文件复制到容器中。但是 Dockerfile for Celery 位于另一个文件夹中,因此无法复制其中的文件,因为它们与上下文无关。

到目前为止,我看到了两种可能性:

  • mount -o bind 似乎看起来很hacky
  • 保留两个文件副本可能会导致不同步的情况
  • 将源代码文件夹声明为一个卷并使用volumes-from.

目前我使用第三种解决方案。有没有更好的方法?git clone在 dockerfile 中使用?但是如何进行身份验证...

Kev*_*own 8

在我们当前的 docker 应用程序中,我们有三个不同的镜像用于两个容器。

  • Base - 这是包含任何常见依赖项(开发头文件)以及 Python 源代码的内容。
  • Web - 这会安装特定于 Web 的依赖项,例如 Gunicorn。它还设置CMD和 端口。
  • Worker - 这将安装特定于工作器的依赖项,主要是设置 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
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,因为它不支持图像继承


Kev*_*own 5

我最初的答案仍然是该问题的有效解决方案,但从 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)