Alpine Linux Docker環境にOCI8拡張機能をインストールしようとしています。うまくいかないと言うところがいくつかありますが、実際にはうまくいくと言うところもあります。 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:行0のUnknownにそのようなファイルまたはディレクトリ(/usr/local/instantclient/libclntsh.so.12.1が必要)はありません
PHPのバージョンは7.1.12
。
私が試したことはapk add libnsl
しかし、これは私にこのエラーを返します:
エラー:満たされない制約:so:libtirpc.so.3(欠落):
だから私も追加してみましたapk add libtirpc-dev
( 'プレーン' libtirpc
は、私のバージョンでは使用できません)ですが、何も変わっていません。
手がかりはありますか?
Oracleがサポートするオペレーティングシステムを使用することをお勧めします。これにより、アルパインをハッキングするという頭痛と、重要な時期にフォールバックしないという不確実性を回避できます。したがって、あなたのビジネスが悪影響を受けることはないという自信をあなたに与えます。試してみてください https://github.com/Oracle/docker-images/tree/master/OracleInstantClient
他のコメント
使用する「スリム」なOracle Linuxコンテナについては、 このブログ を参照してください。
私はこれに答えるのが遅いかもしれません。アルパインのベースイメージがあるという同じ問題が発生し、それに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クライアントの内部イメージを直接ダウンロードし、パスを設定し、パッケージを追加し、最後にシェルスクリプトを使用してシンボリックリンクを作成しています。
私は、最新バージョンのアルパインとインスタントクライアントベーシックライトで動作するように作成した私のバージョンのDockerを共有しています。 Dockerイメージのサイズは124 MBです。
ダウンロードできるgithubを共有しています
Docker + Alpine + Instantclient Basiclite
または、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
これはOracle-CLIENTを使用したGolangのDockerfileです
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"]