web-dev-qa-db-ja.com

アルパインLinux上のOracle

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は、私のバージョンでは使用できません)ですが、何も変わっていません。

手がかりはありますか?

6
Norgul

Oracleがサポートするオペレーティングシステムを使用することをお勧めします。これにより、アルパインをハッキングするという頭痛と、重要な時期にフォールバックしないという不確実性を回避できます。したがって、あなたのビジネスが悪影響を受けることはないという自信をあなたに与えます。試してみてください https://github.com/Oracle/docker-images/tree/master/OracleInstantClient

他のコメント

  • Instant Clientを使用する場合は、Oracle_HOMEを設定しないでください。その変数は、フルソフトウェアインストール用です。
  • Ldconfigを使用してシステムライブラリパスを設定します。InstantClientのインストール手順を参照してください。 ここ
  • 12.2と同じバージョンのDBに接続できるInstant Client 18.3を使用します。 (18.3は、実際には新しいバージョン管理システムで名前が変更された12.2.0.2です)
  • Oracle Linux Dockerイメージを使用すると、手動でダウンロードしなくても18.3 Instant Clientをダウンロードしてインストールできるという利点があります。

使用する「スリム」なOracle Linuxコンテナについては、 このブログ を参照してください。

1

私はこれに答えるのが遅いかもしれません。アルパインのベースイメージがあるという同じ問題が発生し、それに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クライアントの内部イメージを直接ダウンロードし、パスを設定し、パッケージを追加し、最後にシェルスクリプトを使用してシンボリックリンクを作成しています。

1

私は、最新バージョンのアルパインとインスタントクライアントベーシックライトで動作するように作成した私のバージョンの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
0
Alfonso Prado

これは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"]
0
enobyte