Я пытаюсь установить расширение OCI8 в свою среду Alpine Linux Docker. Хотя есть несколько мест, где говорят, что это не сработает, некоторые говорят, что это действительно так. У меня есть версия 3.4, и по корпоративным причинам она пока остается такой.
Я сделал это в моем Docker conf:
# Install Oracle Client and build OCI8 (Oracel Command Interface 8 - PHP extension)
USER root
ENV LD_LIBRARY_PATH=/usr/local/instantclient
ENV ORACLE_HOME=/usr/local/instantclient
RUN apk update && apk upgrade
RUN apk add musl-dev libaio autoconf && apk add --update make
## Unzip Instant Client v12
RUN pecl channel-update pecl.php.net
COPY instantclient_12_2.zip /var/www/html/instantclient_12_2.zip
RUN unzip -d /usr/local/ /var/www/html/instantclient_12_2.zip
RUN ln -s /usr/local/instantclient_12_2 /${ORACLE_HOME} && \
ln -s /${ORACLE_HOME}/libclntsh.so.* /${ORACLE_HOME}/libclntsh.so && \
ln -s /${ORACLE_HOME}/libocci.so.* /${ORACLE_HOME}/libocci.so && \
ln -s /${ORACLE_HOME}/lib* /usr/lib && \
ln -s /${ORACLE_HOME}/sqlplus /usr/bin/sqlplus &&\
ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1
RUN apk add gcc; exit 0 # This has a history of failing sometimes
RUN echo "instantclient,/usr/local/instantclient" | pecl install oci8 &&\
echo 'extension=oci8.so' > /usr/local/etc/php/conf.d/30-oci8.ini &&\
rm -rf /tmp/*.zip /var/cache/apk/* /tmp/pear/
Теперь сборка проходит, и все выглядит нормально, однако, когда я делаю php -v, я получаю следующее:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/oci8.so' - Error loading shared library libnsl.so.1: No such file or directory (needed by /usr/local/instantclient/libclntsh.so.12.1) in Unknown on line 0
Версия PHP - 7.1.12.
То, что я пробовал, делает apk add libnsl, но это возвращает мне эту ошибку:
ERROR: unsatisfiable constraints: so:libtirpc.so.3 (missing):
Итак, я попытался также добавить apk add libtirpc-dev («простой» libtirpc недоступен для моей версии или чего-то в этом роде), но это ничего не изменило.
Какие-нибудь подсказки?






Я бы рекомендовал использовать операционную систему, поддерживаемую Oracle, чтобы избежать головной боли от взлома Alpine и неуверенности в том, что он не упадет в критический момент. И это вселяет в вас уверенность, что ваш бизнес не пострадает. Попробуйте https://github.com/oracle/docker-images/tree/master/OracleInstantClient
Другие комментарии
См. этот блог для получения информации о «тонком» контейнере Oracle Linux, который он использует.
Я думаю, что для многих Oracle Client будет составлять всего лишь один компонент образа Docker, поэтому переход на Oracle Linux только для совместимости с Oracle Client может быть не решением для некоторых. Лично я использую образы Docker на базе Oracle Linux, которые используют клиент, но обнаружил, что в некоторых случаях именно Oracle Linux не обеспечивает надлежащей поддержки других инструментов, которые мне нужны! Есть ли что-то особенное в Alpine?
Заставить мгновенного клиента работать со всем остальным, кроме Oracle Linux, по меньшей мере, проблематично. Я предпочитаю выбирать путь наименьшего сопротивления ...
Возможно, я поздно отвечу на этот вопрос. У меня такая же проблема с базовым образом alpine и добавлением к нему клиента oracle. Итак, я придумал это решение - https://github.com/Shrinidhikulkarni7/OracleClient_Alpine
Вот Dockerfile, но для его работы вам также понадобится сценарий оболочки.
FROM alpine:latest
ENV LD_LIBRARY_PATH=/lib
RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
cp -r instantclient_19_3/* /lib && \
rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
apk add libaio
ADD script.sh /root/script.sh
RUN /root/script.sh
Здесь я напрямую загружаю клиент oracle внутри изображения, устанавливаю путь, добавляю пакеты и, наконец, использую сценарий оболочки для создания символической ссылки.
как собрать с его помощью расширение PHP pdo_oci?
Почему внешний сценарий, а не команда запуска?
Я обновил его на GitHub. Совершенно забыл обновить здесь @ JohanBoulé
@mvorisek Не совсем уверен в этом. Если знаете, пришлите, пожалуйста, PR.
@ShrinidhiKulkarni Я не знаю, использовали ли вы OCI (C API) или OCCI (C++ API), но после обширных попыток я пришел к выводу, что нет способа сделать Musl совместимым с OCCI, и что нам нужно установить полный GLibC " stack »в отдельном каталоге, что в первую очередь лишает смысла использование Alpine.
Вот Dockerfile для Golang с ORACLE-CLIENT
FROM golang:alpine
RUN apk update
ENV CLIENT_FILENAME instantclient-basic-linux.x64-12.1.0.1.0.zip
WORKDIR /opt/oracle/lib
ADD https://github.com/bumpx/oracle-instantclient/raw/master/${CLIENT_FILENAME} .
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
apk add --update libaio libnsl && \
ln -s /usr/lib/libnsl.so.2 /usr/lib/libnsl.so.1
RUN LIBS = "*/libociei.so */libons.so */libnnz12.so */libclntshcore.so.12.1 */libclntsh.so.12.1" && \
unzip ${CLIENT_FILENAME} ${LIBS} && \
for lib in ${LIBS}; do mv ${lib} /usr/lib; done && \
ln -s /usr/lib/libclntsh.so.12.1 /usr/lib/libclntsh.so && \
rm ${CLIENT_FILENAME}
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN apk add git
RUN apk add libc-dev
RUN apk add gcc
RUN go mod tidy
RUN go build -o main .
CMD ["/app/main"]
Я делюсь своей версией докера, которую я сделал для работы с последней версией alpine и Instantclient basiclite. Размер образа докера 124 мб.
Делюсь своим гитхабом, где его можно скачать
Докер + alpine + Instantclient Basiclite
Или вы можете увидеть ниже содержимое файла докеров
FROM alpine:latest
# Install Instantclient Basic Light Oracle and Dependencies
RUN apk --no-cache add 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 && \
unzip instantclient-basiclite.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
Я просто решал аналогичную проблему с помощью драйвера Godror Golang для Oracle. Я никогда не мог решить эту проблему с помощью изображения Alpine. В конечном итоге возникла проблема, заключающаяся в том, что libint.sh никогда не установился полностью и не был распознан системой. Даже изменение файла докера на использование библиотеки Glibc.
В конечном итоге я решил проблему, используя изображения из самого Oracle. Полная версия, а не тонкие изображения, которые можно увидеть здесь: https://github.com/oracle/docker-images/tree/master/OracleLinuxDevelopers
Затем вам нужно установить golang, а затем ваши зависимости Instant client и Oracle, если вам это нужно.
FROM oraclelinux:7 as builder
RUN yum install -y oracle-golang-release-el7 && \
yum install -y git && \
yum install -y golang unzip
COPY . /app
RUN go version
WORKDIR /app
{Your Docker Specific Commands Here}
{Insert Build Specific Environment Variables here}
#Oracle Specific Environment Variables
{Insert Oracle Env Variables here}
WORKDIR /root/
#Install oracle dependencies
RUN yum install -y wget unzip libaio && \
rm -rf /var/cache/yum
#install Oracle Instant Client
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-basic-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient.zip && \
unzip /tmp/instantclient.zip -d /usr/lib/instantclient && \
rm /tmp/instantclient.zip
#Install Oracle SDK
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sdk-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip && \
unzip /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
rm /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip
#Install Oracle Tools through SQLPlus
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sqlplus-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip && \
unzip /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
rm /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip
WORKDIR /app
COPY --from=builder /app/cmd/svr .
EXPOSE 8000
CMD ["./app"]
Опять же, вот как я решил проблему для API Golang. Могут быть другие, которые решили проблему Alpine, но мне так и не удалось заставить его работать, даже используя старую версию Oracle Instant Client.
Попробуйте этот файл Docker. Начните с базового образа alpine linux и добавьте необходимые пакеты.
FROM alpine:3.13
WORKDIR /project
RUN wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-basiclite-linux.x64-21.1.0.0.0.zip -qO- | busybox unzip -q - && \
wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-sqlplus-linux.x64-21.1.0.0.0.zip -qO- | busybox unzip -q - && \
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.33-r0/glibc-2.33-r0.apk -q
RUN apk add --allow-untrusted libaio glibc-2.33-r0.apk
RUN cd instantclient_21_1 && cp /usr/lib/libaio.so.1 /lib/libc.musl-x86_64.so.1 . && chmod +x sqlplus
ENV LD_LIBRARY_PATH=/project/instantclient_21_1
Почему вы одновременно смешиваете musl и glibc?
Хотя переход на что-то, что может его поддерживать, является здравым смыслом, причина этого в том, что большой контейнер сделан из нашего корпоративного продукта, и переключение не является тривиальным (вы давно это не комментировали, но я думаю, лучше отвечать поздно чем никогда :))