Dockerfile:从父镜像复制文件

Dockerfile: Copy files from parent image

我正在构建一个多级 docker 图像,其中我们有一个基础图像,将对其进行扩展以构建实际的最终图像。但是我似乎无法将来自父图像的文件复制到子图像中。

基本图像

FROM debian:10.9-slim AS base

# PHP Version
ONBUILD ARG PHP_VERSION
ONBUILD ENV PHP_VERSION=${PHP_VERSION:-7.4}

# More stuff.
...

# Copy PHP settings into the image
COPY ./php/pool.d/*.conf /build-php/pool.d/
COPY ./php/conf.d/*.ini /build-php/conf.d/

# Onbuild copy the settings to the correct PHP version
ONBUILD COPY /build-php/pool.d/*.conf /etc/php/${PHP_VERSION}/fpm/pool.d/
ONBUILD COPY /build-php/conf.d/*.ini /etc/php/${PHP_VERSION}/fpm/conf.d/
ONBUILD COPY /build-php/conf.d/*.ini /etc/php/${PHP_VERSION}/cli/conf.d/

具体图片

ARG PHP_VERSION=8.0

FROM abcdef.amazonaws.com/php-base:v1.14.0 AS base

构建次映像时出现以下错误

$ docker build -t php8.0:base .
...
 => ERROR [7/1] COPY /build-php/pool.d/*.conf /etc/php/8.0/fpm/pool.d/                                                                                                                                   0.0s
------
 > [7/1] COPY /build-php/pool.d/*.conf /etc/php/8.0/fpm/pool.d/:
------
lstat /var/lib/docker/tmp/buildkit-mount474178567/build-php/pool.d: no such file or directory

我检查了父图像,文件被很好地复制到 /build-php。此外,在构建子图像时(禁用 onbuild 副本),文件位于 /build-php。我不明白为什么onbuild副本找不到文件。

COPY 总是从主机系统复制文件(更具体地说是从 Docker 构建上下文);如果它是 运行 ONBUILD 那么它会强制派生图像的构建上下文(源树)具有特定的布局。

在此设置中,文件已经在基本映像中(在 /build-php 中),因此您需要 RUN cp /build-php/... /etc/php/... 在映像中移动文件。

一般来说,使用 ONBUILD 会让人难以推断什么步骤在什么时候发生,并且会导致令人困惑的副作用。与其拥有一个最终将安装和配置某些版本的 PHP 的基本映像,不如为您使用的每个版本的解释器提供一个完全配置的基本映像,则设置可能会更容易。

# For simplicity, use the Docker Hub base image
# (There can be good reasons to build your own)
ARG PHP_VERSION=7.4
FROM php:${PHP_VERSION}

ARG PHP_VERSION

# Copy PHP settings into the image
COPY ./php/pool.d/*.conf /etc/php/${PHP_VERSION}/fpm/pool.d/
COPY ./php/conf.d/*.ini /etc/php/${PHP_VERSION}/fpm/conf.d/
COPY ./php/conf.d/*.ini /etc/php/${PHP_VERSION}/cli/conf.d/
docker build \
  --build-arg PHP_VERSION=8.0 \
  -t abcdef.amazonaws.com/php-80-base:v1.14.0 \
  .