如何在两个不同的Dockerfile中扩展/继承/连接,使用多阶段构建?

目前我使用docker-machinedocker-compose实现了部署过程。 (我部署了多个相关服务-一个是Django应用程序,另一个是resty-auto-ssl Docker镜像(参考:https://github.com/Valian/docker-nginx-auto-ssl

我的docker-compose文件类似于:

services:
  web:

  nginx:

  postgres:

(注意:我不在生产环境中使用postgres,这只是一个例子)。

我需要做的是将所有内容打包到一个构建的Docker镜像中。

每个服务引用不同的Dockerfile基础,一个用于Django应用程序:

FROM python:3.7.2-slim

RUN apt-get update && apt-get -y install cron && apt-get -y install nano

ENV PYTHONUNBUFFERED 1

RUN mkdir /usr/src/app

WORKDIR /usr/src/app

COPY ./requirements.txt /usr/src/app/requirements.txt

RUN pip install --upgrade pip

RUN pip install -r requirements.txt

COPY . /usr/src/app

RUN ["chmod", "+x", "/usr/src/app/init.sh"]

和一个用于valian/docker-nginx-auto-ssl镜像:

FROM valian/docker-nginx-auto-ssl

COPY nginx.conf /usr/local/openresty/nginx/conf/

我假设理论上可以将这两个Dockerfile某种方式连接在一起?这是利用多阶段Docker构建(https://docs.docker.com/v17.09/engine/userguide/eng-image/multistage-build/#before-multi-stage-builds)被用于连接docker-compose服务的情况吗?

点赞
用户6870228
用户6870228

我不认为你能将镜像加入,Dockerfile 镜像就像一个虚拟机硬盘,这就像要我把两个硬盘映像合并成一个。这些镜像可能是不同版本的 Linux,甚至是 Windows。如果你想要一个单一的镜像,你可以从一个基础镜像(比如 Alpine Linux)开始,然后安装所有你想要的依赖。

但好消息是你可以获得 Dockfile 中使用的镜像的源代码,这样所有关于如何在 Docker 中构建所需内容的工作都已经为你完成了。

例如,对于 Python 的部分 -> https://github.com/jfloff/alpine-python

然后对于 nginx-auto -> https://github.com/Valian/docker-nginx-auto-ssl

因为 nginx-auto-ssl 是基于 alpine-fat 的,所以我建议使用那个。然后获取这两个 Docker 文件的详细信息并将它们合并。

一旦你创建了这个镜像,你就可以再次使用它。虽然初始设置可能有点麻烦,但后来的好处是值得的。

2019-11-29 16:53:34