web-dev-qa-db-fra.com

Oracle sur Alpine Linux

J'essaie d'installer l'extension OCI8 sur mon environnement Alpine Linux Docker. Bien que plusieurs endroits disent que cela ne fonctionnera pas, certains disent que cela fonctionne réellement. J'ai un 3.4 version et pour des raisons professionnelles ça reste comme ça pour le moment.

Je l'ai fait dans ma conf Docker:

# 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/

Maintenant, la construction passe, et ça semble correct, cependant quand je fais un php -v J'obtiens ce qui suit:

Avertissement PHP: PHP Démarrage: impossible de charger la bibliothèque dynamique '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/oci8.so' - Erreur lors du chargement partagé bibliothèque libnsl.so.1: aucun fichier ou répertoire de ce type (requis par /usr/local/instantclient/libclntsh.so.12.1) dans Unknown sur la ligne 0

La version PHP est 7.1.12.

Ce que j'ai essayé c'est de faire apk add libnsl mais cela me renvoie cette erreur:

ERREUR: contraintes non satisfaisantes: donc: libtirpc.so.3 (manquant):

J'ai donc essayé d'ajouter également apk add libtirpc-dev (le 'plain' libtirpc n'est pas disponible pour ma version ou quelque chose), mais cela n'a rien changé.

Des indices?

6
Norgul

Je recommanderais d'utiliser un système d'exploitation pris en charge par Oracle, évitant ainsi le mal de tête de pirater Alpine et l'incertitude qu'il ne tombera pas à un moment critique. Et ainsi vous donner une certaine confiance que votre entreprise ne sera pas affectée négativement. Essayez https://github.com/Oracle/docker-images/tree/master/OracleInstantClient

Autres commentaires

  • Ne définissez pas Oracle_HOME lorsque vous utilisez Instant Client. Cette variable est destinée aux installations logicielles complètes.
  • Utilisez ldconfig pour définir le chemin de la bibliothèque système, voir les instructions d'installation d'Instant Client, par ex. ici .
  • Utilisez Instant Client 18.3, qui peut se connecter aux mêmes versions de base de données que 12.2. (18.3 est vraiment le 12.2.0.2 renommé dans le nouveau système de versioning)
  • L'utilisation d'images Oracle Linux Docker a l'avantage de télécharger et d'installer le client instantané 18.3 sans que vous ayez à effectuer manuellement le téléchargement.

Voir ce blog pour plus d'informations sur le conteneur Oracle Linux "mince" qu'il utilise.

1
Christopher Jones

Je serai peut-être en retard pour répondre à cette question. J'ai eu le même problème d'avoir une image de base Alpine et d'ajouter un client Oracle à cela. J'ai donc trouvé cette solution - https://github.com/Shrinidhikulkarni7/OracleClient_Alpine

Voici le Dockerfile, mais vous auriez également besoin du script Shell pour qu'il fonctionne.

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

Ici, je télécharge directement le client Oracle à l'intérieur de l'image, définissant le chemin d'accès, ajoutant des packages et enfin utilisant le script Shell pour créer un lien symbolique.

1
Shrinidhi Kulkarni

Je partage ma version de docker que j'ai conçue pour fonctionner avec la dernière version d'Alpine et d'instantclient basiclite. La taille de l'image docker est de 124 Mo.

Je partage mon github où vous pouvez le télécharger

Docker + Alpine + Instantclient Basiclite

Ou vous pouvez voir ci-dessous le contenu du dockerfile

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
0
Alfonso Prado

Voici le Dockerfile pour Golang avec 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"]
0
enobyte