【问题标题】:Dockerfile: Copy files from parent imageDockerfile:从父镜像复制文件
【发布时间】:2021-07-13 10:30:29
【问题描述】:

我正在构建一个多级 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 副本找不到文件。

【问题讨论】:

    标签: docker dockerfile docker-multi-stage-build


    【解决方案1】:

    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 构建,我还遗漏了很多不相关的代码,所以从我的问题来看,它可能看起来有点矫枉过正 :-) 将 ONBUILD COPY ... 更改为 ONBUILD RUN cp ... 成功了!
    猜你喜欢
    • 2019-06-27
    • 2020-05-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多