Dockerfile可以扩展另一个吗?

q5lcpyga  于 2023-05-16  发布在  Docker
关注(0)|答案(4)|浏览(141)

我有一个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和其他东西。
我可以创建一个“dev”Dockerfile来扩展我的主Dockerfile(而不重写它)吗?

iqjalb3h

iqjalb3h1#

使用multi-stage build绝对是这里答案的一部分。
docker-compose v3.4 target是第二个也是最后一个。
下面是一个例子,有2个容器(1个正常的和1个w/ xdebug安装)生活在一起:
Dockerfile

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
  
# ...
ibrsph3r

ibrsph3r2#

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

# syntax = edrevo/dockerfile-plus

INCLUDE+ Dockerfile.base

RUN whatever

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

bmvo0sr5

bmvo0sr53#

这正是您的FROM php:7-fpm正在做的事情:使用Dockerfile的内容从php镜像(带有7-fpm标签)扩展Dockerfile。
因此,在从Dockerfile构建镜像之后:

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

您可以通过创建一个新的Dockerfile来扩展它,该文件以以下开头:

FROM my-php-base-image
kcwpcxri

kcwpcxri4#

Sand是我编写的一个小型开源工具,通过允许您以类似Python的语法编写dockerfiles,使您能够在它们之间共享代码,来满足此需求(以及许多其他需求)。
给定以下目录结构:

my-monorepo/
│
├── tweet-service/
|   ├── src/
|   ├── ...
│   └── Sandfile
│
├── home-timeline/
|   ├── src/
|   ├── ...
│   └── Sandfile
│
└── Sandfile

你可以这样写你的Sandfile

# ./my-monorepo/Sandfile
from sand import *

def MyService(name):
    From("ubuntu", "20.04")
    Run("apt-get install python3")
    Copy(Src="src", Dst="/app")
    Entrypoint(f"python3 /app/{name}.py")

Sand("tweet-service")
Sand("home-timeline")
# ./my-monorepo/tweet-service/Sandfile
from sand import *

MyService("tweet-service") # Defined in ../Sandfile
# ./my-monorepo/home-timeline/Sandfile
from sand import *

MyService("home-timeline") # Defined in ../Sandfile

这允许您在Dockerfiles之间共享代码,并保持它们DRY
这类似于add_subdirectoryCMake中的工作方式

相关问题