在Alpine Linux上的Oracle

Nor*_*gul 5 php oracle docker alpine-linux

我正在尝试在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/
Run Code Online (Sandbox Code Playgroud)

现在构建通过了,看起来还不错,但是当我这样做时,我php -v得到以下信息:

PHP警告:PHP启动:无法加载动态库'/usr/local/lib/php/extensions/no-debug-non-zts-20160303/oci8.so'-加载共享库libnsl.so.1时出错:否第0行上“未知”中的文件或目录(/usr/local/instantclient/libclntsh.so.12.1所需)

PHP版本是7.1.12

我已经尝试做的是,apk add libnsl但这会返回此错误:

错误:约束无法满足:so:libtirpc.so.3(丢失):

因此,我也尝试添加apk add libtirpc-dev(“ plain” libtirpc不适用于我的版本或其他内容),但是并没有改变。

有什么线索吗?

Alf*_*ado 7

我分享了我制作的用于与最新版本的 alpine 和 instantclient basiclite 一起使用的 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
Run Code Online (Sandbox Code Playgroud)


Chr*_*nes 1

我建议使用Oracle支持的操作系统,这样可以避免黑客入侵Alpine的麻烦以及关键时刻不会崩溃的不确定性。从而让您有信心您的业务不会受到负面影响。尝试https://github.com/oracle/docker-images/tree/master/OracleInstantClient

其他的建议

  • 使用 Instant Client 时不要设置 ORACLE_HOME。该变量适用于完整的软件安装。
  • 使用 ldconfig 设置系统库路径,请参阅 Instant Client 安装说明,例如此处
  • 使用 Instant Client 19,它可以连接到与 12.2 相同的数据库版本。(19实际上是新版本控制系统中重命名的终端12.2版本)
  • 使用 Oracle Linux Docker 映像的优点是,它将下载并安装 19 Instant Client,而无需您手动进行下载。

请参阅此博客,了解有关其使用的“精简”Oracle Linux 容器的信息。

  • 虽然切换到可能支持它的东西是常识,但其背后的原因是因为一个大容器是由我们公司的产品制成的,并且切换并不是微不足道的(自从您发表评论以来已经很长时间了,但我想最好晚点回答)比从来没有:)) (4认同)