Oracle на Alpine linux

Я пытаюсь установить расширение 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: запуск PHP: невозможно загрузить динамическую библиотеку '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/oci8.so' - Ошибка при загрузке общей библиотеки libnsl.so.1: нет файл или каталог (требуется /usr/local/instantclient/libclntsh.so.12.1) в Unknown в строке 0

Версия PHP - 7.1.12.

То, что я пробовал, делает apk add libnsl, но это возвращает мне эту ошибку:

ОШИБКА: невыполнимые ограничения: итак: libtirpc.so.3 (отсутствует):

Поэтому я попытался также добавить apk add libtirpc-dev ("простой" libtirpc недоступен для моей версии или чего-то в этом роде), но это ничего не изменило.

Какие-нибудь подсказки?


person Norgul    schedule 12.11.2018    source источник


Ответы (6)


Я делюсь своей версией докера, которую я сделал для работы с последней версией alpine и Instantclient basiclite. Размер образа докера 124 мб.

Делюсь своим гитхабом, где его можно скачать

Docker + 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
person Alfonso Prado    schedule 02.04.2020

Возможно, я поздно отвечу на этот вопрос. У меня такая же проблема с базовым изображением 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 внутри изображения, устанавливаю путь, добавляю пакеты и, наконец, использую сценарий оболочки для создания символической ссылки.

person Shrinidhi Kulkarni    schedule 13.10.2019
comment
как построить pdo_oci расширение php с ним? - person mvorisek; 11.09.2020
comment
Почему внешний сценарий, а не команда запуска? - person Johan Boulé; 02.06.2021
comment
Я обновил его на GitHub. Совершенно забыл обновить здесь @ JohanBoulé - person Shrinidhi Kulkarni; 03.06.2021
comment
@mvorisek Не совсем уверен в этом. Если знаете, пришлите, пожалуйста, PR. - person Shrinidhi Kulkarni; 03.06.2021
comment
@ShrinidhiKulkarni Я не знаю, использовали ли вы OCI (C API) или OCCI (C ++ API), но после обширных попыток я пришел к выводу, что нет способа сделать Musl совместимым с OCCI, и что нам нужно установить полный стек GLibC в отдельном каталоге, что в первую очередь лишает смысла использование Alpine. - person Johan Boulé; 11.06.2021

Я бы рекомендовал использовать операционную систему, поддерживаемую Oracle, чтобы избежать головной боли от взлома Alpine и неуверенности в том, что он не упадет в критический момент. И это вселяет в вас уверенность, что ваш бизнес не пострадает. Попробуйте https://github.com/oracle/docker-images/tree/master/OracleInstantClient

Другие комментарии

  • Не устанавливайте ORACLE_HOME при использовании Instant Client. Эта переменная предназначена для полной установки программного обеспечения.
  • Используйте ldconfig, чтобы задать путь к системной библиотеке, см. Инструкции по установке Instant Client, например. здесь.
  • Используйте Instant Client 19, который может подключаться к тем же версиям БД, что и 12.2. (19 - это действительно переименованная версия терминала 12.2 в новой системе управления версиями)
  • Преимущество использования образов Oracle Linux Docker состоит в том, что он загружает и устанавливает 19 Instant Client без необходимости выполнять загрузку вручную.

См. этот блог для информация о «тонком» контейнере Oracle Linux, который он использует.

person Christopher Jones    schedule 13.11.2018
comment
Хотя разумно переходить на то, что может его поддерживать, причина этого в том, что большой контейнер сделан из нашего корпоративного продукта, и переключение не является тривиальным (вы давно это не комментировали, но я думаю, лучше отвечать поздно. чем никогда :)) - person Norgul; 30.04.2019
comment
Я думаю, что для многих Oracle Client будет составлять всего лишь один компонент образа Docker, поэтому переход на Oracle Linux только для совместимости с Oracle Client может быть не решением для некоторых. Лично я использую образы Docker на базе Oracle Linux, которые используют клиента, но обнаружил, что в некоторых случаях именно Oracle Linux не обеспечивает надлежащей поддержки других инструментов, которые мне нужны! Есть ли что-то особенное в Alpine? - person Drumbeg; 03.06.2020
comment
Заставить мгновенного клиента работать со всем остальным, кроме Oracle Linux, по меньшей мере проблематично. Я предпочитаю выбирать путь наименьшего сопротивления ... - person Meki; 19.06.2020

Вот 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"]
person enobyte    schedule 31.12.2019

Я просто решал аналогичную проблему с помощью драйвера 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.

person Namor81    schedule 17.12.2020

Попробуйте этот файл 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

person Patrick    schedule 01.05.2021
comment
Почему вы одновременно смешиваете musl и glibc? - person Johan Boulé; 02.06.2021