Oracle on Alpine linux
Asked Answered
R

7

12

I am trying to install OCI8 extension on my Alpine Linux Docker environment. Although there are several places saying it won't work, there are some which say it actually does. I have a 3.4 version and for corporate reasons it is staying like that for now.

I have done this within my 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/

Now the build passes, and it looks okay, however when I do a php -v I am getting the following:

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20160303/oci8.so' - Error loading shared library libnsl.so.1: No such file or directory (needed by /usr/local/instantclient/libclntsh.so.12.1) in Unknown on line 0

PHP version is 7.1.12.

What I've tried is doing apk add libnsl but this returns me this error:

ERROR: unsatisfiable constraints: so:libtirpc.so.3 (missing):

So I tried also adding apk add libtirpc-dev (the 'plain' libtirpc isn't available for my version or something), but that changed nothing.

Any clues?

Rabbinate answered 12/11, 2018 at 14:13 Comment(0)
P
7

I share my version of docker that I made to work with the latest version of alpine and instantclient basiclite. The size of the docker image is 124 mb.

I share my github where you can download it

Docker + alpine + Instantclient Basiclite

Or you can see below the content of the 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
Pity answered 2/4, 2020 at 4:57 Comment(1)
It does not work for sdlldr utility, gives below error: Error relocating ./sqlldr: __printf_chk: symbol not found Error relocating ./sqlldr: __strncat_chk: symbol not found Error relocating ./sqlldr: __vsprintf_chk: symbol not found Error relocating ./sqlldr: __fprintf_chk: symbol not foundCoalesce
M
2

I might be late to answer this. I got the same problem of having a alpine base image and add oracle client to that. So i came up with this solution - https://github.com/Shrinidhikulkarni7/OracleClient_Alpine

Here is the Dockerfile, but you would also need the shell script in it for it to work.

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

Over here I'm directly downloading the oracle client inside image, setting the path, adding packages and finally using the shell script for creating symbolic link.

Muir answered 13/10, 2019 at 5:54 Comment(7)
how to build pdo_oci php extension with it?Melba
Why an external script rather than a run command ?Posehn
I have updated it on GitHub. Totally forgot to update here @JohanBouléMuir
@Melba Not really sure about it. If you know, please send a PR.Muir
@ShrinidhiKulkarni I don't know whether you used OCI (C API) or OCCI (C++ API), but after extensive tries, I concluded that there's no way to make Musl compatible with OCCI, and that we need to install the full GLibC "stack" in a separate directory, which defeats the purpose of using Alpine in the first place.Posehn
@JohanBoulé, there is, see https://mcmap.net/q/829092/-oracle-on-alpine-linux.Gonfalonier
@JakubJirutka interesting. Do you have details on the sort of hacks you had to do to make their binaries work on musl?Posehn
A
1

I'd recommend using an operating system supported by Oracle, thus avoiding the headache of hacking Alpine and the uncertainty that it won't fall over at a critical time. And thus giving you some confidence your business won't be negatively impacted. Try https://github.com/oracle/docker-images/tree/master/OracleInstantClient

Other comments

  • Don't set ORACLE_HOME when using Instant Client. That variable is for full software installs.
  • Use ldconfig to set the system library path, see the Instant Client installation instructions e.g. here.
  • Use Instant Client 19, which can connect to the same DB versions that 12.2 can. (19 is really the renamed terminal 12.2 release in the new versioning system)
  • Using Oracle Linux Docker images has the advantage that it will download and install the 19 Instant Client without you having to manually do the download.

See this blog for info about the 'slim' Oracle Linux container it uses.

Avelinaaveline answered 13/11, 2018 at 23:31 Comment(3)
While it is common sense switching to something that may support it, the reasoning behind this is because a large container is made of our corporate product and switch is not trivial (it's been a long time since you commented this, but I guess better answering late than never :))Rabbinate
I think for a lot of people the Oracle Client would make up just one component of a Docker image, so steering towards Oracle Linux just for Oracle Client compatibility may not be the answer for some. Personally, I am using Oracle Linux based Docker images that utilise the client, but have found that in some cases it is Oracle Linux that doesn't provide the proper support for the other tools I need! Is there something specifically about Alpine that is problematic?Participation
Getting the instantclient to work on everything else than Oracle Linux is problematic to say the least. I tend to choose the path of least resistance...Fortyish
G
0

I hacked Oracle Instant Client to work with musl libc and packaged it for Alpine Linux (APKBUILD). At the time of writing, it’s instantclient 21.11.0.0.0, built for Alpine Linux v3.18. The package(s) are available in my user aports.

Package names:

  • oracle-instantclient – libclntsh.so, libclntshcore.so, libnnz21.so, libocci_gcc53.so
  • oracle-instantclient-dev – header files
  • oracle-instantclient-java – ojdbc8.jar, libocijdbc21.so etc.
  • oracle-instantclient-mysql – liboramysql.so
  • oracle-instantclient-oci – libocci.so and libociicus.so
  • oracle-instantclient-sqlplus – The SQL*Plus command line tool for SQL and PL/SQL queries

To install it on Alpine Linux v3.18:

  1. Add security key of the repository to your /etc/apk/keys:

    cd /etc/apk/keys
    wget https://raw.githubusercontent.com/jirutka/user-aports/master/.keys/[email protected]
    
  2. Add the user repository to your /etc/apk/repositories:

    echo https://repo.jirutka.cz/alpine/v3.18/user >> /etc/apk/repositories
    
  3. Update cache:

    apk update
    
  4. Install oracle-instantclient-oci or other (sub)packages listed above:

    apk add oracle-instantclient-oci
    
Gonfalonier answered 8/9, 2023 at 19:17 Comment(0)
J
-1

Here is the Dockerfile For Golang With 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"]
Jataka answered 31/12, 2019 at 9:59 Comment(0)
D
-1

I was just tackling a similar problem to this using the Godror Golang Driver for Oracle. I was never able to solve this on using an Alpine image. The problem eventually came that libint.sh, would never fully install to be recognized by the system. Even changing the docker file to using the Glibc library.

How i eventually fixed the issue was to use the images from Oracle itself. The full version not the slim images that can be seen here: https://github.com/oracle/docker-images/tree/master/OracleLinuxDevelopers

you then have to install golang and then your Instant client and Oracle dependencies if you need it.

FROM oraclelinux:7 as builder
RUN yum install -y oracle-golang-release-el7 && \
    yum install -y git && \
    yum install -y golang unzip

COPY . /app
RUN go version
WORKDIR /app
{Your Docker Specific Commands Here}

{Insert Build Specific Environment Variables here}
#Oracle Specific Environment Variables
{Insert Oracle Env Variables here}

WORKDIR /root/
#Install oracle dependencies
RUN yum install -y wget unzip libaio && \
    rm -rf /var/cache/yum
#install Oracle Instant Client
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-basic-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient.zip && \
    unzip /tmp/instantclient.zip -d /usr/lib/instantclient && \
    rm /tmp/instantclient.zip

#Install Oracle SDK
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sdk-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip && \
    unzip /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
    rm /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip

#Install Oracle Tools through SQLPlus
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sqlplus-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip && \
    unzip /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
    rm /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip

WORKDIR /app

COPY --from=builder /app/cmd/svr .
EXPOSE 8000

CMD ["./app"]

Again this is how i solved the problem for a Golang API. There may be others that solved the Alpine issue but i was never able to get it to work, even using older version of the Oracle Instant Client.

Dude answered 17/12, 2020 at 14:11 Comment(0)
D
-3

Try this Docker file. Start from the basic alpine linux image and add the required packages.

FROM alpine:3.13

WORKDIR /project

RUN wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-basiclite-linux.x64-21.1.0.0.0.zip -qO- | busybox  unzip -q - && \
    wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-sqlplus-linux.x64-21.1.0.0.0.zip -qO- | busybox  unzip -q - && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.33-r0/glibc-2.33-r0.apk -q

RUN apk add --allow-untrusted libaio glibc-2.33-r0.apk

RUN cd instantclient_21_1 && cp /usr/lib/libaio.so.1 /lib/libc.musl-x86_64.so.1 . && chmod +x sqlplus

ENV LD_LIBRARY_PATH=/project/instantclient_21_1

Deform answered 1/5, 2021 at 20:46 Comment(1)
Why are you mixing musl and glibc at the same time ?Posehn

© 2022 - 2024 — McMap. All rights reserved.