Dockerfile中php:8.0-fpm-alpine的OCI8扩展



我正在尝试在dockerfile中为php:8.0-fpm-alpine image安装并启用OCI8。。

这是我Dockerfile:的一部分

ARG PHP_VERSION=8.0
FROM php:${PHP_VERSION}-fpm-alpine AS api_platform_php
# Install Oracle Instantclient
RUN mkdir /usr/lib/oracle
RUN apk --no-cache add libaio curl && 
curl -o instantclient.zip https://download.oracle.com/otn_software/linux/instantclient/217000/instantclient-basic-linux.x64-21.7.0.0.0dbru.zip -SL && 
curl -o instantclient-sdk.zip https://download.oracle.com/otn_software/linux/instantclient/217000/instantclient-sdk-linux.x64-21.7.0.0.0dbru.zip -SL && 
unzip instantclient.zip && unzip instantclient-sdk.zip &&
mv instantclient_21_7 /usr/lib/oracle/ && 
rm instantclient.zip && rm instantclient-sdk.zip && 
cd /usr/lib/oracle/instantclient_21_7 
&& ln -sf libclntsh.so.21.1 libclntsh.so 
&& ln -sf libclntshcore.so.21.1 libclntshcore.so 
&& ln -sf libocci.so.21.1 libocci.so 
&& rm -rf *.zip
#ENV LD_LIBRARY_PATH /usr/lib/oracle/instantclient
#ENV ORACLE_BASE /usr/lib/oracle/instantclient
#ENV TNS_ADMIN /usr/lib/oracle/instantclient
#ENV ORACLE_HOME /usr/lib/oracle/instantclient
# Install Oracle extensions
RUN docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/usr/lib/oracle/instantclient_21_7 
&& echo 'instantclient > /usr/lib/oracle/instantclient_21_7/' 
&& ldconfig | pecl install oci8-3.0.1 
&& docker-php-ext-install 
pdo_oci 
&& docker-php-ext-enable 
oci8

结果如下:

(...)
checking for PHP prefix... /usr/local
checking for PHP includes... -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib
checking for PHP extension directory... /usr/local/lib/php/extensions/no-debug-non-zts-20200930
checking for PHP installed headers prefix... /usr/local/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for gawk... no
checking for nawk... no
checking for awk... awk
checking if awk is broken... no
checking for Oracle Database OCI8 support... yes, shared
checking PHP version... 8.0.17, ok
checking OCI8 DTrace support... no
checking size of long... 8
checking if we're at 64-bit platform... yes
configure: WARNING: OCI8 extension: ORACLE_HOME is not set, looking for default Oracle Instant Client instead
checking Oracle Instant Client directory... configure: error: Oracle Instant Client directory /usr/lib/oracle/.../client64/lib libraries not found. Try --with-oci8=instantclient,DIR

配置:错误:Oracle Instant Client目录/usr/lib/Oracle//找不到client64/lib库。尝试--with-oci8=instantclient,DIR

感谢您的帮助

我已成功启用扩展
我认为我的问题在于安装顺序
这里是完整的Dockerfile:

# the different stages of this Dockerfile are meant to be built into separate images
# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage
# https://docs.docker.com/compose/compose-file/#target

# https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
ARG PHP_VERSION=8.0
ARG CADDY_VERSION=2
# "php" stage
FROM php:${PHP_VERSION}-fpm-alpine AS api_platform_php
# persistent / runtime deps
RUN apk add --no-cache 
acl 
fcgi 
file 
gettext 
git 
gnu-libiconv 
;
# install gnu-libiconv and set LD_PRELOAD env to make iconv work fully on Alpine image.
# see https://github.com/docker-library/php/issues/240#issuecomment-763112749
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so
ARG APCU_VERSION=5.1.20
RUN set -eux; 
apk add --no-cache --virtual .build-deps 
$PHPIZE_DEPS 
icu-dev 
libzip-dev 
postgresql-dev 
zlib-dev 
; 

docker-php-ext-configure zip; 
docker-php-ext-install -j$(nproc) 
intl 
pdo_pgsql 
pdo_mysql 
zip 
pcntl 
; 
pecl install 
apcu-${APCU_VERSION} 
; 
pecl clear-cache; 
docker-php-ext-enable 
apcu 
opcache 
; 

runDeps="$( 
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions 
| tr ',' 'n' 
| sort -u 
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' 
)"; 
apk add --no-cache --virtual .api-phpexts-rundeps $runDeps; 

apk del .build-deps
###> recipes ###
###< recipes ###
## install Oracle Instantclient
RUN apk --no-cache add pcre-dev ${PHPIZE_DEPS} 
&& pecl install xdebug 
&& docker-php-ext-enable xdebug 
&& apk del pcre-dev ${PHPIZE_DEPS}
RUN apk --no-cache add php8-pear php8-dev gcc musl-dev libaio libnsl libc6-compat curl && 
cd /tmp && 
curl -o instantclient-basiclite.zip https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -SL && 
curl -o instantclient-sdk.zip https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip -SL && 
unzip instantclient-basiclite.zip && 
unzip instantclient-sdk.zip && 
mv instantclient*/ /usr/lib/instantclient && 
rm instantclient-basiclite.zip && 
ln -s /usr/lib/instantclient/libclntsh.so.19.1 /usr/lib/libclntsh.so && 
ln -s /usr/lib/instantclient/libocci.so.19.1 /usr/lib/libocci.so && 
ln -s /usr/lib/instantclient/libociicus.so /usr/lib/libociicus.so && 
ln -s /usr/lib/instantclient/libnnz19.so /usr/lib/libnnz19.so && 
ln -s /usr/lib/libnsl.so.2 /usr/lib/libnsl.so.1 && 
ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2 && 
ln -s /lib64/ld-linux-x86-64.so.2 /usr/lib/ld-linux-x86-64.so.2
ENV ORACLE_BASE /usr/lib/instantclient
ENV LD_LIBRARY_PATH /usr/lib/instantclient
ENV TNS_ADMIN /usr/lib/instantclient
ENV ORACLE_HOME /usr/lib/instantclient
RUN docker-php-ext-configure oci8 --with-oci8=instantclient,$ORACLE_HOME && docker-php-ext-install oci8
RUN docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,$ORACLE_HOME && docker-php-ext-install pdo_oci
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
RUN ln -s $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
COPY docker/php/conf.d/api-platform.prod.ini $PHP_INI_DIR/conf.d/api-platform.ini
COPY docker/php/php-fpm.d/zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf
VOLUME /var/run/php
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV PATH="${PATH}:/root/.composer/vendor/bin"
WORKDIR /srv/api
# build for production
ARG APP_ENV=prod
# prevent the reinstallation of vendors at every changes in the source code
COPY composer.json composer.lock symfony.lock ./
RUN set -eux; 
composer install --prefer-dist --no-dev --no-scripts --no-progress; 
composer clear-cache
# copy only specifically what we need
COPY .env ./
COPY bin bin/
COPY config config/
COPY migrations migrations/
COPY public public/
COPY src src/
COPY templates templates/
RUN set -eux; 
mkdir -p var/cache var/log; 
composer dump-autoload --classmap-authoritative --no-dev; 
composer dump-env prod; 
composer run-script --no-dev post-install-cmd; 
chmod +x bin/console; sync
VOLUME /srv/api/var
COPY docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck
RUN chmod +x /usr/local/bin/docker-healthcheck
HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD ["docker-healthcheck"]
COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint
RUN chmod +x /usr/local/bin/docker-entrypoint
ENV SYMFONY_PHPUNIT_VERSION=9
ENTRYPOINT ["docker-entrypoint"]
CMD ["php-fpm"]
# "caddy" stage
# depends on the "php" stage above
FROM caddy:${CADDY_VERSION}-builder-alpine AS api_platform_caddy_builder
# install Mercure and Vulcain modules
RUN xcaddy build 
--with github.com/dunglas/mercure 
--with github.com/dunglas/mercure/caddy 
--with github.com/dunglas/vulcain 
--with github.com/dunglas/vulcain/caddy
FROM caddy:${CADDY_VERSION} AS api_platform_caddy
WORKDIR /srv/api
COPY --from=api_platform_caddy_builder /usr/bin/caddy /usr/bin/caddy
COPY --from=api_platform_php /srv/api/public public/
COPY docker/caddy/Caddyfile /etc/caddy/Caddyfile

最新更新