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
编辑:
遗憾的是我没有提供所有细节:
我 运行 构建图像的命令是 DOCKER_BUILDKIT=1 docker build . -t test/icu:latest
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。
我正在尝试构建优化的 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
编辑:
遗憾的是我没有提供所有细节:
我 运行 构建图像的命令是
DOCKER_BUILDKIT=1 docker build . -t test/icu:latest
Docker 版本 20.10.12,构建 e91ed57
这似乎不是每个人都可以重现的,所以我不知道还能提供什么。
最后,如果我不启用构建工具包,那么构建命令会成功运行,因此我将下面的答案标记为已接受。
我不太确定您在这里尝试通过多阶段构建实现什么目标,但这显然会扰乱您的扩展。你真的不需要多阶段,因为 alpine apk
提供了处理构建依赖性的工具。
我没有完全挖掘这个过程,所以可能会进一步优化,但这里有一个 Dockerfile:
- 将所需的构建包安装为虚拟包
- 安装
icu-dev
和 phpintl
扩展。请注意,扩展已安装启用,因此无需在单独的步骤中执行此操作 - 完成后删除构建依赖虚拟包
所有这些都在一个层中进行,因此您最终只会得到严格需要的东西(即 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。