tmkzmu
tmkzmu

Reputation: 21

Oracle with PHP on Docker

I'm trying to install an Oracle database drive for my Laravel application. I'm using Laravel Sail to provide Docker.

The problem is that the Oracle driver can't build. This message occurs:

/usr/bin/ld: skipping incompatible /opt/oracle/instantclient_19_14/libclntsh.so when searching for -lclntsh
/usr/bin/ld: cannot find -lclntsh
/usr/bin/ld: skipping incompatible /opt/oracle/instantclient_19_14/libclntsh.so when searching for -lclntsh
collect2: error: ld returned 1 exit status
make: *** [Makefile:227: oci8.la] Error 1
ERROR: `make' failed

My dockerfile: https://pastebin.com/RTPWt1XK

I'm using MacBook Pro (v. 12 with M1)

Upvotes: 2

Views: 1818

Answers (1)

f.llanquipichun
f.llanquipichun

Reputation: 143

Using the Instant Client for Linux ARM (instantclient-basic-linux.arm64-19.10.0.0.0) and PHP 8.2

This dockerfile works for me:

FROM ubuntu:22.04

LABEL maintainer="Taylor Otwell"

ARG WWWGROUP
ARG NODE_VERSION=18
ARG POSTGRES_VERSION=14

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update \
    && apt-get install -y gnupg gosu curl wget ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils \
    && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
    && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
    && apt-get update \
    && apt-get install -y php8.2-cli php8.2-dev \
       php8.2-pgsql php8.2-sqlite3 php8.2-gd \
       php8.2-curl \
       php8.2-imap php8.2-mysql php8.2-mbstring \
       php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \
       php8.2-intl php8.2-readline \
       php8.2-ldap \
       php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \
       php8.2-memcached php8.2-pcov php8.2-xdebug \
    && php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
    && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
    && apt-get install -y nodejs \
    && npm install -g npm \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \
    && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
    && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \
    && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
    && apt-get update \
    && apt-get install -y yarn \
    && apt-get install -y mysql-client \
    && apt-get install -y postgresql-client-$POSTGRES_VERSION \
    && apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_19_10/"
ENV ORACLE_HOME="/opt/oracle/instantclient_19_10/"
ENV OCI_HOME="/opt/oracle/instantclient_19_10/"
ENV OCI_LIB_DIR="/opt/oracle/instantclient_19_10/"
ENV OCI_INCLUDE_DIR="/opt/oracle/instantclient_19_10/sdk/include"
ENV OCI_VERSION=19

# Download Oracle
RUN mkdir /opt/oracle \
    && cd /opt/oracle \
    && wget https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip \
    && wget https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-sdk-linux.arm64-19.10.0.0.0dbru.zip \
    && unzip /opt/oracle/instantclient-basic-linux.arm64-19.10.0.0.0dbru.zip -d /opt/oracle \
    && unzip /opt/oracle/instantclient-sdk-linux.arm64-19.10.0.0.0dbru.zip -d /opt/oracle \
    && rm -rf /opt/oracle/*.zip \
    && echo /opt/oracle/instantclient_19_10 > /etc/ld.so.conf.d/oracle-instantclient.conf \
    && ldconfig

# Configure Oracle
RUN apt-get update \
    && apt-get install -y \
      php-dev \
      php-pear \
      build-essential \
      libaio1 \
      libaio-dev \
      freetds-dev
RUN pecl channel-update pecl.php.net \
    && echo 'instantclient,/opt/oracle/instantclient_19_10' | pecl install oci8 \
    && echo extension=oci8.so >> /etc/php/8.2/cli/php.ini \
    && echo "extension=oci8.so" >> /etc/php/8.2/mods-available/oci8.ini

RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.2

RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.2/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000

ENTRYPOINT ["start-container"]

Upvotes: 2

Related Questions