diff --git a/CHANGELOG.md b/CHANGELOG.md index ce1c98f..a7816d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## v1.1.0 Under Development - Enh #32 Update to PHP `8.5` (@terabytesoftw) +- Bug #33 Build `sqlsrv/pdo_sqlsrv` in full image on PHP `8.5` using `BuildKit-mounted` scripts (@terabytesoftw) ## v1.0.0 September 13, 2025 diff --git a/src/flavor/apache/Dockerfile b/src/flavor/apache/Dockerfile index 5d05980..6141254 100644 --- a/src/flavor/apache/Dockerfile +++ b/src/flavor/apache/Dockerfile @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1.7 #============================================================================== # Yii2 Docker - Debian Trixie + PHP 8.5 FPM + Apache with HTTP/2 # Supports: full (testing), dev (development), prod (production) @@ -167,8 +168,6 @@ RUN install-php-extensions \ #------------------------------------------------------------------------------ FROM dev AS full -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - # Layer 07: Full extensions RUN install-php-extensions \ oci8 \ @@ -177,41 +176,8 @@ RUN install-php-extensions \ # Layer 08: Microsoft SQL Server support # Note: Using Debian 12 (bookworm) repo since Trixie (13) is not yet officially supported by Microsoft -# hadolint ignore=DL3003,SC2153 -RUN set -ex \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - curl \ - gnupg \ - ca-certificates \ - && curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \ - && echo 'deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main' > /etc/apt/sources.list.d/mssql-release.list \ - && apt-get update \ - && ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 \ - && read -r -a phpize_deps <<< "${PHPIZE_DEPS}" \ - && apt-get install -y --no-install-recommends unixodbc unixodbc-dev "${phpize_deps[@]}" \ - && printf '\\n' | pecl install sqlsrv-5.12.0 \ - && PHP_VERSION_ID="$(php -r 'echo PHP_VERSION_ID;')" \ - && if [[ "${PHP_VERSION_ID}" -ge 80500 ]]; then \ - cd /tmp \ - && pecl download pdo_sqlsrv-5.12.0 \ - && tar -xf pdo_sqlsrv-5.12.0.tgz \ - && rm -f pdo_sqlsrv-5.12.0.tgz \ - && cd pdo_sqlsrv-5.12.0 \ - && sed -i 's/= dbh->error_mode/= (enum pdo_error_mode) dbh->error_mode/' pdo_dbh.cpp \ - && sed -i 's/zval_ptr_dtor( &dbh->query_stmt_zval );/OBJ_RELEASE(dbh->query_stmt_obj);dbh->query_stmt_obj=NULL;/' php_pdo_sqlsrv_int.h \ - && phpize \ - && ./configure --with-php-config="$(command -v php-config)" \ - && make -j"$(nproc)" \ - && make install \ - && rm -rf /tmp/pdo_sqlsrv-5.12.0; \ - else \ - printf '\\n' | pecl install pdo_sqlsrv-5.12.0; \ - fi \ - && docker-php-ext-enable sqlsrv pdo_sqlsrv \ - && apt-get purge -y --auto-remove gnupg unixodbc-dev "${phpize_deps[@]}" \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN --mount=type=bind,source=src/script/build,target=/opt/build,ro \ + /bin/bash /opt/build/10-mssql-php-ext.sh #============================================================================== # Production Build diff --git a/src/script/build/01-mssql-odbc.sh b/src/script/build/01-mssql-odbc.sh new file mode 100755 index 0000000..d2dfdca --- /dev/null +++ b/src/script/build/01-mssql-odbc.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail + +mssql_add_apt_repo() { + apt-get update + apt-get install -y --no-install-recommends ca-certificates curl gnupg + + curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg + echo 'deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main' >/etc/apt/sources.list.d/mssql-release.list +} + +mssql_install_odbc_runtime() { + apt-get update + ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 unixodbc +} diff --git a/src/script/build/10-mssql-php-ext.sh b/src/script/build/10-mssql-php-ext.sh new file mode 100755 index 0000000..a6d3603 --- /dev/null +++ b/src/script/build/10-mssql-php-ext.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${SCRIPT_DIR}/01-mssql-odbc.sh" + +main() { + mssql_add_apt_repo + mssql_install_odbc_runtime + + read -r -a phpize_deps <<<"${PHPIZE_DEPS:-}" + apt-get install -y --no-install-recommends unixodbc-dev "${phpize_deps[@]}" + + printf '\n' | pecl install sqlsrv-5.12.0 + + local php_version_id + php_version_id="$(php -r 'echo PHP_VERSION_ID;')" + + if [[ "${php_version_id}" -ge 80500 ]]; then + cd /tmp + pecl download pdo_sqlsrv-5.12.0 + tar -xf pdo_sqlsrv-5.12.0.tgz + rm -f pdo_sqlsrv-5.12.0.tgz + + cd pdo_sqlsrv-5.12.0 + + sed -i 's/= dbh->error_mode/= (enum pdo_error_mode) dbh->error_mode/' pdo_dbh.cpp + sed -i 's/zval_ptr_dtor( &dbh->query_stmt_zval );/OBJ_RELEASE(dbh->query_stmt_obj);dbh->query_stmt_obj=NULL;/' php_pdo_sqlsrv_int.h + + phpize + ./configure --with-php-config="$(command -v php-config)" + make -j"$(nproc)" + make install + rm -rf /tmp/pdo_sqlsrv-5.12.0 + else + printf '\n' | pecl install pdo_sqlsrv-5.12.0 + fi + + docker-php-ext-enable sqlsrv pdo_sqlsrv + + apt-get purge -y --auto-remove gnupg unixodbc-dev "${phpize_deps[@]}" + apt-get clean + rm -rf /var/lib/apt/lists/* /tmp/pear /tmp/* /var/tmp/* +} + +main "$@"