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 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 недоступен для моей версии или чего-то в этом роде), но это ничего не изменило.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
11
0
13 531
6

Ответы 6

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

Хотя переход на что-то, что может его поддерживать, является здравым смыслом, причина этого в том, что большой контейнер сделан из нашего корпоративного продукта, и переключение не является тривиальным (вы давно это не комментировали, но я думаю, лучше отвечать поздно чем никогда :))

Norgul 30.04.2019 07:33

Я думаю, что для многих Oracle Client будет составлять всего лишь один компонент образа Docker, поэтому переход на Oracle Linux только для совместимости с Oracle Client может быть не решением для некоторых. Лично я использую образы Docker на базе Oracle Linux, которые используют клиент, но обнаружил, что в некоторых случаях именно Oracle Linux не обеспечивает надлежащей поддержки других инструментов, которые мне нужны! Есть ли что-то особенное в Alpine?

Drumbeg 03.06.2020 13:30

Заставить мгновенного клиента работать со всем остальным, кроме Oracle Linux, по меньшей мере, проблематично. Я предпочитаю выбирать путь наименьшего сопротивления ...

Meki 19.06.2020 10:34

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

mvorisek 10.09.2020 23:39

Почему внешний сценарий, а не команда запуска?

Johan Boulé 02.06.2021 09:00

Я обновил его на GitHub. Совершенно забыл обновить здесь @ JohanBoulé

Shrinidhi Kulkarni 03.06.2021 16:50

@mvorisek Не совсем уверен в этом. Если знаете, пришлите, пожалуйста, PR.

Shrinidhi Kulkarni 03.06.2021 16:53

@ShrinidhiKulkarni Я не знаю, использовали ли вы OCI (C API) или OCCI (C++ API), но после обширных попыток я пришел к выводу, что нет способа сделать Musl совместимым с OCCI, и что нам нужно установить полный GLibC " stack »в отдельном каталоге, что в первую очередь лишает смысла использование Alpine.

Johan Boulé 11.06.2021 20:39

Вот 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?

Johan Boulé 02.06.2021 09:25

Другие вопросы по теме