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 \
.
我正在构建一个多级 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 \
.