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?
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
Voir ce blog pour plus d'informations sur le conteneur Oracle Linux "mince" qu'il utilise.
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.
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
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"]