microsoft / msphpsql

Microsoft Drivers for PHP for SQL Server
MIT License
1.78k stars 371 forks source link

Error on both ARM64 and AMD64 docker build #1504

Closed TKrisee closed 3 months ago

TKrisee commented 3 months ago

Please check the FAQ (frequently-asked questions) first. If you have other questions or something to report, please address the following (skipping questions might delay our responses):

PHP version

PHP 8.2.16 (cli) (built: Mar  7 2024 08:55:56) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.16, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.16, Copyright (c), by Zend Technologies
    with Xdebug v3.3.1, Copyright (c) 2002-2023, by Derick Rethans

PHP SQLSRV or PDO_SQLSRV version

sqlsrv-5.12.0
pdo_sqlsrv-5.12.0

Microsoft ODBC Driver version

msodbcsql18_18.3.2.1-1
mssql-tools18_18.2.1.1-1

SQL Server version
2016 (I dont know any other specifics)

Client operating system
Ubuntu 22.04 (docker)

Problem description
After building the docker image (dockerfile below, the target name is "app-sqlsrv") on ARM64 I get the "PHP Fatal error: Unsupported processor architecture." while on AMD64 I get the "SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for SQL Server to communicate with SQL Server. Access the following URL to download the ODBC Driver for SQL Server for x64: https://go.microsoft.com/fwlink/?LinkId=163712" error message.

ARG AARCH
ARG PLATFORM

FROM --platform=${PLATFORM} ubuntu:22.04 as app

LABEL maintainer="Inline Studio"
LABEL org.opencontainers.image.description "Base Docker image for Laravel development"

ARG NODE_MAJOR=20
ARG POSTGRES_VERSION=14
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV ACCEPT_EULA=Y

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# Overwrite default sh to bash
RUN ln -sf /bin/bash /bin/sh

RUN apt-get update \
    && apt-get install -y wget gnupg gosu locate curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 software-properties-common dnsutils librsvg2-bin lsof imagemagick imagemagick-doc \
    && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \
    && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
    && curl -sS https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor | tee /usr/share/keyrings/nodesource.gpg > /dev/null \
    && echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
    && add-apt-repository ppa:alex-p/tesseract-ocr-devel -y \
    && apt-get update \
    && apt-get install -y \
        php8.2-cli \
        php8.2-dev \
        php8.2-pgsql \
        php8.2-sqlite3 \
        php8.2-mysql \
        php8.2-odbc \
        php8.2-gd \
        php8.2-imagick \
        php8.2-curl \
        php8.2-imap \
        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 \
    && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
    && apt-get install -y nodejs \
    && npm install -g npm \
    && npm install -g pnpm \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarn.gpg >/dev/null \
    && echo "deb [signed-by=/usr/share/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 /usr/share/keyrings/pgdg.gpg >/dev/null \
    && echo "deb [signed-by=/usr/share/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 mc \
        yarn \
        mysql-client \
        postgresql-client-$POSTGRES_VERSION \
        graphviz \
        tesseract-ocr

RUN --mount=type=secret,id=COMPOSER_AUTH \
    cat /run/secrets/COMPOSER_AUTH > /root/.config/composer/auth.json

RUN git clone "https://github.com/jokkedk/webgrind.git" /webgrind

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

RUN apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY start-container /usr/local/bin/start-container
COPY /configs/supervisord/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY /configs/php/php.ini /etc/php/8.2/cli/conf.d/99-sail.ini
COPY /configs/webgrind/config.php /webgrind/config.php
COPY /configs/imagick/policy.xml /etc/ImageMagick-6/policy.xml
RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000 9006 5173

ENTRYPOINT ["start-container"]

# Database Image
FROM --platform=${PLATFORM} mariadb:10 as database

COPY configs/mysql/my.cnf /etc/mysql/my.cnf

# SQLSRV Version
FROM --platform=${PLATFORM} ghcr.io/inlinestudio/laravel-docker-app:main as app-sqlsrv
ARG AARCH

COPY debs/msodbcsql18_18.3.2.1-1_${AARCH}.deb /msodbcsql18_18.3.2.1-1_${AARCH}.deb
COPY debs/mssql-tools18_18.2.1.1-1_${AARCH}.deb /mssql-tools18_18.2.1.1-1_${AARCH}.deb

RUN curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
    && curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | tee /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && apt-get install -y unixodbc \
        odbcinst \
    && dpkg -i /msodbcsql18_18.3.2.1-1_${AARCH}.deb \
    && dpkg -i /mssql-tools18_18.2.1.1-1_${AARCH}.deb \
    && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc \
    && source ~/.bashrc \
    && apt-get install -y unixodbc-dev

RUN pecl install sqlsrv-5.12.0 \
    && pecl install pdo_sqlsrv-5.12.0 \
    && printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.2/mods-available/sqlsrv.ini \
    && printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.2/mods-available/pdo_sqlsrv.ini \
    && phpenmod sqlsrv pdo_sqlsrv

COPY configs/openssl/openssl.cnf /usr/local/ssl/openssl.cnf
COPY configs/openssl/openssl.sh /etc/profile.d/openssl.sh

RUN export OPENSSL_CONF=/usr/local/ssl/openssl.cnf

RUN apt-get purge --auto-remove openssl -y
RUN wget -O ~/openssl-1.1.1f.tar.gz https://www.openssl.org/source/openssl-1.1.1f.tar.gz --no-check-certificate \
    && mkdir -p /opt/openssl \
    && tar xfvz ~/openssl-1.1.1f.tar.gz --directory /opt/openssl \
    && export LD_LIBRARY_PATH=/opt/openssl/lib \
    && cd /opt/openssl/openssl-1.1.1f \
    && ./config --prefix=/opt/openssl --openssldir=/opt/openssl/ssl \
    && make install \
    && updatedb \
    && chmod +x /etc/profile.d/openssl.sh \
    && source /etc/profile.d/openssl.sh \
    && export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH

The openssl version is set to 1.1.1f because otherwise the connection cannot be made and it times out.

Expected behavior and actual behavior
The sql connection is made.

TKrisee commented 3 months ago

For anyone who's having the same issue, this comment helped me solve it: https://github.com/microsoft/msphpsql/issues/1453#issuecomment-1878935421