Dockerfile可以扩展另一个吗?

Syl*_*ain 46 docker dockerfile

我有一个像这样的PHP Dockerfile:

FROM php:7-fpm
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y git libicu-dev libmagickwand-dev libmcrypt-dev libcurl3-dev jpegoptim
RUN pecl install imagick && \
    docker-php-ext-enable imagick

RUN docker-php-ext-install intl
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install opcache
RUN docker-php-ext-install mcrypt
RUN docker-php-ext-install curl
RUN docker-php-ext-install zip
Run Code Online (Sandbox Code Playgroud)

我想创建另一个Dockerfile,基于第一个,但添加了一些PHP扩展(用于开发目的):Xdebug和其他东西.

我可以创建一个扩展我的主Dockerfile的"dev"Dockerfile(不重写它)吗?

Cet*_*thy 19

使用多阶段构建绝对是这里答案的一部分。

docker-compose v3.4target是倒数第二个。

这是一个将2个容器(1个普通容器和1个带xdebug的容器)一起放置的示例:

Docker文件

FROM php:7-fpm AS php_base 
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y git libicu-dev libmagickwand-dev libmcrypt-dev libcurl3-dev jpegoptim
RUN pecl install imagick && \
    docker-php-ext-enable imagick

RUN docker-php-ext-install intl
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install opcache
RUN docker-php-ext-install mcrypt
RUN docker-php-ext-install curl
RUN docker-php-ext-install zip

FROM php_base AS php_test

RUN pecl install xdebug 
RUN docker-php-ext-enable xdebug
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3.4'

services:
  php:
    build:
      context: ./
      target: php_base

  php_test:
    build:
      context: ./
      target: php_test

# ...
Run Code Online (Sandbox Code Playgroud)

  • 是的![这个](https://docs.docker.com/develop/develop-images/multistage-build/#use-a-previous-stage-as-a-new-stage)似乎解决了我遇到的问题。 (2认同)

edr*_*evo 18

如果您不想标记您的第一个 Dockerfile 以便FROM在下一个 Dockerfile的指令中使用它,并且您使用的是 Docker 20.10+,您也可以这样做:

# syntax = edrevo/dockerfile-plus

INCLUDE+ Dockerfile.base

RUN whatever
Run Code Online (Sandbox Code Playgroud)

INCLUDE+指令由 Dockerfile 中的第一行导入。您可以在https://github.com/edrevo/dockerfile-plus 上阅读有关 dockerfile-plus 的更多信息


lar*_*sks 15

这正是您FROM php:7-fpm正在做的事情:使用Dockerfile的内容从php图像(带7-fpm标记)扩展Dockerfile.

所以在从Dockerfile构建图像之后:

docker build -t my-php-base-image .
Run Code Online (Sandbox Code Playgroud)

您可以通过创建一个以以下内容开头的新Dockerfile来扩展它:

FROM my-php-base-image
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个docker-compose设置,你希望在dockerfile级别上将一个容器建立在另一个容器上,该怎么办?如果应在一台机器上运行多个版本的环境,则此处不能选择映像. (36认同)
  • 我认为这个答案并不好,因为问题是如何导入`dockerfile`而不是构建的图像.我认为基本问题是"如何在多个类似的Dockerfiles上保存重复的代码"? (12认同)
  • 没什么.我想有一个dockerfile的调试版本,它扩展了添加gdb的主dockerfile.有了这个,我将不得不总是在主要和扩展... (5认同)
  • 我想说这个答案是错误的,因为它将源代码与内置的人工制品混为一谈。`FROM php:7-fpm` 构建在 docker 镜像之上,而不是 Docker 文件之上。具体来说,符号“php:7-fpm”引用了 docker 注册表中构建的映像的名称,而不是本地文件系统上的另一个(Dockerfile)文件。无论它是否符合OP的需求,它都没有回答所写的问题。 (4认同)
  • 答案甚至使用了“完全”这个词。这并不完全是“完全”。 (3认同)
  • @Niksac 您找到解决方案了吗?这正是我现在需要的 (2认同)
  • @larsks例如,对于两个不同的Ubuntu版本,我具有完全相同的Dockerfile,不同之处是开头的FROM行不同-一个是FROM ubuntu:trusty映像,另一个是FROM ubuntu:bionic映像。我希望有一种方法可以将FROM行之后的所有内容都包含在某种Dockerfile中,而不是在两个不同的文件中维护相同Dockerfile代码的两个副本。 (2认同)