Dockerfile可以扩展另一个文件吗?


69

我有一个像这样的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

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

我可以创建扩展主Dockerfile的“ dev” Dockerfile(无需重写)吗?


3
在文档中找不到。
西尔万

4
您当然可以在第一个镜像上创建新的dockerfile
Jimmy,

5
Dockerfile可以扩展另一个文件,例如不必构建中间映像吗?
弗兰克·罗伯特·安德森

2
@FrankRobertAnderson在有关INCLUDE在Dockerfile中添加指令的大量讨论中,这位评论者建议使用make从各个部分组成一个Dockerfile。
asciimo '18年

Answers:


16

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

因此,从Dockerfile构建映像后:

docker build -t my-php-base-image .

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

FROM my-php-base-image

48
如果您有一个docker-compose设置,想要在dockerfile级别上将一个容器基于另一个容器怎么办?如果应在一台机器上运行多个版本的环境,则无法使用映像。
Niksac

41
我认为这个答案不好,因为问题是如何导入dockerfile而不是构建的图像。我认为基本问题是“如何在多个类似的Dockerfile上保存重复代码”?
WebQube

9
没什么。我想拥有一个dockerfile的调试版本,该版本扩展了添加gdb的主要dockerfile。有了这个,我将不得不始终在主要的和扩展的基础上进行docker构建...
Martin Kosicky

2
@Niksac找到解决方案了吗?这正是我现在所需要的
Shardj

3
@larsks例如,对于两个不同的Ubuntu版本,我具有完全相同的Dockerfile,不同之处是开头的FROM行不同-一个是FROM ubuntu:trusty映像,另一个是FROM ubuntu:bionic映像。我希望有一种方法可以将FROM行之后的所有内容都包含在某种Dockerfile中,而不是在两个不同的文件中维护相同Dockerfile代码的两个副本。
CivFan

48

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

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

docker-compose.yml

version: '3.4'

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

  php_test:
    build:
      context: ./
      target: php_test

# ...

1
是! 似乎解决了我的问题。
JosefSábl20年

0

如果您不想标记第一个Dockerfile以便FROM在下一个Dockerfile的指令中使用它,并且您正在使用Docker 20.10+,也可以执行以下操作:

# syntax = edrevo/dockerfile-plus

INCLUDE+ Dockerfile.base

RUN whatever

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.