在 Docker 容器之间共享代码库

在 Docker 容器之间共享代码库

我有两个容器。一个用于保存运行 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

相关内容