icu-dev 库删除了 /bin/sh 或弄乱了图像入口点

icu-dev library removes /bin/sh or messes up the image entry point

我正在尝试构建优化的 PHP 图像。我选择的策略是在构建阶段安装和编译所有内容,然后将扩展复制到新阶段并启用它们。这让我可以减少 200MB。

在国际延期之前一切都很好。这个扩展需要 icu-dev 库,但是一旦我安装了它,/bin/sh 就消失了,或者入口点不知何故变得一团糟。这是非常低级的东西,我什至不知道如何搜索问题。

# Prepare compiled extensions
FROM php:8.1-cli-alpine as build

RUN apk --no-cache add autoconf build-base icu-dev

RUN docker-php-ext-install intl

FROM php:8.1-cli-alpine

COPY --from=build /usr/local/lib/php/extensions/no-debug-non-zts-20210902/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20210902/intl.so

RUN apk --no-cache add icu-dev

RUN docker-php-ext-enable intl

这是图像构建的输出

[+] Building 1.6s (10/10) FINISHED                                                                                                                                                                                                                                        
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                 0.0s
 => => transferring dockerfile: 429B                                                                                                                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/php:8.1-cli-alpine                                                                                                                                                                                                1.3s
 => [auth] library/php:pull token for registry-1.docker.io                                                                                                                                                                                                           0.0s
 => [build 1/3] FROM docker.io/library/php:8.1-cli-alpine@sha256:858d56e3ee12e138a9119380fb361a5b01f1ff9369d372ef73042b6cd4753f25                                                                                                                                    0.0s
 => CACHED [build 2/3] RUN apk --no-cache add autoconf build-base icu-dev                                                                                                                                                                                            0.0s
 => CACHED [build 3/3] RUN docker-php-ext-install intl                                                                                                                                                                                                               0.0s
 => CACHED [stage-1 2/4] COPY --from=build /usr/local/lib/php/extensions/no-debug-non-zts-20210902/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20210902/intl.so                                                                                           0.0s
 => CACHED [stage-1 3/4] RUN apk --no-cache add icu-dev                                                                                                                                                                                                              0.0s
 => ERROR [stage-1 4/4] RUN docker-php-ext-enable intl                                                                                                                                                                                                               0.3s
------                                                                                                                                                                                                                                                                    
 > [stage-1 4/4] RUN docker-php-ext-enable intl:
#10 0.251 container_linux.go:380: starting container process caused: exec: "/bin/sh": stat /bin/sh: no such file or directory
------
executor failed running [/bin/sh -c docker-php-ext-enable intl]: exit code: 1
make: *** [Makefile:4: build] Error 1

这是一个复制的回购协议,以防有人感兴趣

https://github.com/benelori/icu-dev-reproduction

编辑:

遗憾的是我没有提供所有细节:

  1. 我 运行 构建图像的命令是 DOCKER_BUILDKIT=1 docker build . -t test/icu:latest

  2. Docker 版本 20.10.12,构建 e91ed57

这似乎不是每个人都可以重现的,所以我不知道还能提供什么。

最后,如果我不启用构建工具包,那么构建命令会成功运行,因此我将下面的答案标记为已接受。

我不太确定您在这里尝试通过多阶段构建实现什么目标,但这显然会扰乱您的扩展。你真的不需要多阶段,因为 alpine apk 提供了处理构建依赖性的工具。

我没有完全挖掘这个过程,所以可能会进一步优化,但这里有一个 Dockerfile:

  • 将所需的构建包安装为虚拟包
  • 安装 icu-dev 和 php intl 扩展。请注意,扩展已安装启用,因此无需在单独的步骤中执行此操作
  • 完成后删除构建依赖虚拟包

所有这些都在一个层中进行,因此您最终只会得到严格需要的东西(即 intl 扩展和必需的 icu-dev 包,除非我忘记了一些额外的可能清理。 ..)

FROM php:8.1-cli-alpine

RUN apk add --no-cache autoconf build-base --virtual build_deps && \
    apk add --no-cache icu-dev && \
    docker-php-ext-install intl && \
    apk del build_deps

您可以从该 Dockerfile 文件构建为

docker build -t test:test .

并看到扩展按预期可用:

$ docker run -it --rm test:test sh -c "php -i | grep -A 7 intl"
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-intl.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini

PHP API => 20210902
PHP Extension => 20210902
Zend Extension => 420210902
Zend Extension Build => API420210902,NTS
PHP Extension Build => API20210902,NTS
--
intl

Internationalization support => enabled
ICU version => 69.1
ICU Data version => 69.1
ICU Unicode version => 13.0

Directive => Local Value => Master Value
intl.default_locale => no value => no value
intl.error_level => 0 => 0
intl.use_exceptions => Off => Off

json

json support => enabled

libxml

生成的图像为 135MB(相比之下,不删除构建依赖项时为 366MB)。这使得它比撰写本文时 94.2MB 的基本图像多大约 40MB。