@@ -88,103 +88,98 @@ COPY ./data/php-7.2.34.tar.xz /usr/src/php.tar.xz
8888COPY --from=php-source /usr/local/bin/docker-php-source /usr/local/bin/
8989
9090
91- RUN set -eux; \
92- \
93- savedAptMark="$(apt-mark showmanual)" ; \
94- apt-get update; \
95- apt-get install -y --no-install-recommends \
96- libargon2-dev \
97- libcurl4-openssl-dev \
98- libedit-dev \
99- libsodium-dev \
100- libsqlite3-dev \
101- libssl-dev \
102- libxml2-dev \
103- zlib1g-dev \
104- ${PHP_EXTRA_BUILD_DEPS:-} \
105- ; \
106- rm -rf /var/lib/apt/lists/*; \
107- \
108- export \
109- CFLAGS="$PHP_CFLAGS" \
110- CPPFLAGS="$PHP_CPPFLAGS" \
111- LDFLAGS="$PHP_LDFLAGS" \
112- ; \
113- docker-php-source extract; \
114- cd /usr/src/php; \
115- gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" ; \
116- debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)" ; \
117- # https://bugs.php.net/bug.php?id=74125
118- if [ ! -d /usr/include/curl ]; then \
119- ln -sT "/usr/include/$debMultiarch/curl" /usr/local/include/curl; \
120- fi; \
121- ./configure \
122- --build="$gnuArch" \
123- --with-config-file-path="$PHP_INI_DIR" \
124- --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
125- \
126- # make sure invalid --configure-flags are fatal errors instead of just warnings
127- --enable-option-checking=fatal \
128- \
129- # https://github.com/docker-library/php/issues/439
130- --with-mhash \
131- \
132- # --enable-ftp is included here because ftp_ssl_connect() needs ftp to be compiled statically (see https://github.com/docker-library/php/issues/236)
133- --enable-ftp \
134- # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)
135- --enable-mbstring \
136- # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)
137- --enable-mysqlnd \
138- # https://wiki.php.net/rfc/argon2_password_hash (7.2+)
139- --with-password-argon2 \
140- # https://wiki.php.net/rfc/libsodium
141- --with-sodium=shared \
142- # always build against system sqlite3 (https://github.com/php/php-src/commit/6083a387a81dbbd66d6316a3a12a63f06d5f7109)
143- --with-pdo-sqlite=/usr \
144- --with-sqlite3=/usr \
145- \
146- --with-curl \
147- --with-libedit \
148- --with-openssl \
149- --with-zlib \
150- \
151- # bundled pcre does not support JIT on s390x
152- # https://manpages.debian.org/stretch/libpcre3-dev/pcrejit.3.en.html#AVAILABILITY_OF_JIT_SUPPORT
153- $(test "$gnuArch" = 's390x-linux-gnu' && echo '--without-pcre-jit' ) \
154- --with-libdir="lib/$debMultiarch" \
155- \
156- ${PHP_EXTRA_CONFIGURE_ARGS:-} \
157- ; \
158- make -j "$(nproc)" ; \
159- find -type f -name '*.a' -delete; \
160- make install; \
161- find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; \
162- make clean; \
163- \
164- # https://github.com/docker-library/php/issues/692 (copy default example "php.ini" files somewhere easily discoverable)
165- cp -v php.ini-* "$PHP_INI_DIR/" ; \
166- \
167- cd /; \
168- docker-php-source delete; \
169- \
170- # reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
171- apt-mark auto '.*' > /dev/null; \
172- [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
173- find /usr/local -type f -executable -exec ldd '{}' ';' \
174- | awk '/=>/ { print $(NF-1) }' \
175- | sort -u \
176- | xargs -r dpkg-query --search \
177- | cut -d: -f1 \
178- | sort -u \
179- | xargs -r apt-mark manual \
180- ; \
181- apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
182- \
183- # update pecl channel definitions https://github.com/docker-library/php/issues/443
184- pecl update-channels; \
185- rm -rf /tmp/pear ~/.pearrc; \
186- # smoke test
187- php --version
91+ # 第一阶段: 准备编译环境
92+ RUN set -eux && \
93+ savedAptMark="$(apt-mark showmanual)" && \
94+ apt-get update && \
95+ apt-get install -y --no-install-recommends \
96+ libargon2-dev \
97+ libcurl4-openssl-dev \
98+ libedit-dev \
99+ libsodium-dev \
100+ libsqlite3-dev \
101+ libssl-dev \
102+ libxml2-dev \
103+ zlib1g-dev \
104+ ${PHP_EXTRA_BUILD_DEPS:-} && \
105+ rm -rf /var/lib/apt/lists/* && \
106+ echo "Build dependencies installed successfully"
107+
108+ # 第二阶段: 提取源码并配置
109+ RUN set -eux && \
110+ export CFLAGS="$PHP_CFLAGS" && \
111+ export CPPFLAGS="$PHP_CPPFLAGS" && \
112+ export LDFLAGS="$PHP_LDFLAGS" && \
113+ docker-php-source extract && \
114+ cd /usr/src/php && \
115+ gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" && \
116+ debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)" && \
117+ echo "Architecture: $gnuArch, Multiarch: $debMultiarch"
118+
119+ # 第三阶段: 修复curl路径并配置编译
120+ RUN set -eux && \
121+ cd /usr/src/php && \
122+ export CFLAGS="$PHP_CFLAGS" && \
123+ export CPPFLAGS="$PHP_CPPFLAGS" && \
124+ export LDFLAGS="$PHP_LDFLAGS" && \
125+ gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" && \
126+ debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)" && \
127+ if [ ! -d /usr/include/curl ]; then \
128+ ln -sT "/usr/include/$debMultiarch/curl" /usr/local/include/curl; \
129+ fi && \
130+ ./configure \
131+ --build="$gnuArch" \
132+ --with-config-file-path="$PHP_INI_DIR" \
133+ --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
134+ --enable-option-checking=fatal \
135+ --with-mhash \
136+ --enable-ftp \
137+ --enable-mbstring \
138+ --enable-mysqlnd \
139+ --with-password-argon2 \
140+ --with-sodium=shared \
141+ --with-pdo-sqlite=/usr \
142+ --with-sqlite3=/usr \
143+ --with-curl \
144+ --with-libedit \
145+ --with-openssl \
146+ --with-zlib \
147+ $(test "$gnuArch" = 's390x-linux-gnu' && echo '--without-pcre-jit' ) \
148+ --with-libdir="lib/$debMultiarch" \
149+ ${PHP_EXTRA_CONFIGURE_ARGS:-}
150+
151+ # 第四阶段: 编译和安装
152+ RUN set -eux && \
153+ cd /usr/src/php && \
154+ make -j "$(nproc)" && \
155+ find . -type f -name '*.a' -delete && \
156+ make install && \
157+ find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true && \
158+ make clean && \
159+ cp -v php.ini-* "$PHP_INI_DIR/"
160+
161+ # 第五阶段: 清理和优化
162+ RUN set -eux && \
163+ cd / && \
164+ docker-php-source delete && \
165+ savedAptMark="$(apt-mark showmanual)" && \
166+ apt-mark auto '.*' > /dev/null && \
167+ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark && \
168+ find /usr/local -type f -executable -exec ldd '{}' ';' 2>/dev/null \
169+ | awk '/=>/ { print $(NF-1) }' \
170+ | sort -u \
171+ | xargs -r dpkg-query --search 2>/dev/null \
172+ | cut -d: -f1 \
173+ | sort -u \
174+ | xargs -r apt-mark manual && \
175+ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false
176+
177+ # 第六阶段: PECL配置和验证
178+ RUN set -eux && \
179+ pecl update-channels && \
180+ rm -rf /tmp/pear ~/.pearrc && \
181+ php --version
182+
188183
189184# COPY docker-php-ext-* docker-php-entrypoint /usr/local/bin/
190185
0 commit comments