TimWolla / docker-adminer

Database management in a single PHP file
https://hub.docker.com/_/adminer/
157 stars 69 forks source link

Enable MSSQL / Microsoft SQL Server #170

Open bluepuma77 opened 1 month ago

bluepuma77 commented 1 month ago

Here is a hacky solution to enable MSSQL (link).

  1. Update PHP to 8
  2. Install gpg, sudo
  3. Add and run msodbc.sh
  4. Install autoconf, make, g++, unixodbc-dev
  5. pecl install and enable pdo_sqlsrv, sqlsrv
  6. Add TrustServerCertificate to adminer.php
# Dockerfile
FROM php:8-alpine

RUN echo "upload_max_filesize = 128M" >> /usr/local/etc/php/conf.d/0-upload_large_dumps.ini \
&&  echo "post_max_size = 128M" >> /usr/local/etc/php/conf.d/0-upload_large_dumps.ini \
&&  echo "memory_limit = 1G" >> /usr/local/etc/php/conf.d/0-upload_large_dumps.ini \
&&  echo "max_execution_time = 600" >> /usr/local/etc/php/conf.d/0-upload_large_dumps.ini \
&&  echo "max_input_vars = 5000" >> /usr/local/etc/php/conf.d/0-upload_large_dumps.ini

STOPSIGNAL SIGINT

RUN addgroup -S adminer \
&&  adduser -S -G adminer adminer \
&&  mkdir -p /var/www/html \
&&  mkdir /var/www/html/plugins-enabled \
&&  chown -R adminer:adminer /var/www/html

WORKDIR /var/www/html

RUN apk add --no-cache --virtual .build-deps gpg sudo
COPY    msodbc.sh /var/www/html/
RUN sh msodbc.sh
RUN set -x \
&&  apk add --no-cache --virtual .build-deps \
    autoconf \
    make \
    g++ \
    unixodbc-dev \
    postgresql-dev \
    sqlite-dev \
    unixodbc-dev \
    freetds-dev \
&&  docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
&&  docker-php-ext-install \
    mysqli \
    pdo_pgsql \
    pdo_sqlite \
    pdo_odbc \
    pdo_dblib \
&&  docker-php-source extract \
&&  pecl install pdo_sqlsrv \
&&  pecl install sqlsrv \
&&  docker-php-ext-enable pdo_sqlsrv sqlsrv \
&&  docker-php-source delete \
&&  runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
&&  apk add --virtual .phpexts-rundeps $runDeps \
&&  apk del --no-network .build-deps

COPY    *.php /var/www/html/

ENV ADMINER_VERSION 4.8.1
ENV ADMINER_DOWNLOAD_SHA256 2fd7e6d8f987b243ab1839249551f62adce19704c47d3d0c8dd9e57ea5b9c6b3
ENV ADMINER_COMMIT 1f173e18bdf0be29182e0d67989df56eadea4754

RUN set -x \
&&  apk add --no-cache --virtual .build-deps git \
&&  curl -fsSL "https://github.com/vrana/adminer/releases/download/v$ADMINER_VERSION/adminer-$ADMINER_VERSION.php" -o adminer.php \
&&  echo "$ADMINER_DOWNLOAD_SHA256  adminer.php" |sha256sum -c - \
&&  git clone --recurse-submodules=designs --depth 1 --shallow-submodules --branch "v$ADMINER_VERSION" https://github.com/vrana/adminer.git /tmp/adminer \
&&  commit="$(git -C /tmp/adminer/ rev-parse HEAD)" \
&&  [ "$commit" = "$ADMINER_COMMIT" ] \
&&  cp -r /tmp/adminer/designs/ /tmp/adminer/plugins/ . \
&&  rm -rf /tmp/adminer/ \
&&  apk del --no-network  .build-deps

RUN sed -i 's/"CharacterSet"=>"UTF-8"/"CharacterSet"=>"UTF-8","TrustServerCertificate"=>"Yes"/g' adminer.php

COPY    entrypoint.sh /usr/local/bin/
ENTRYPOINT  [ "entrypoint.sh", "docker-php-entrypoint" ]

USER    adminer
CMD [ "php", "-S", "[::]:8080", "-t", "/var/www/html" ]

EXPOSE 8080

And the additional MS ODBC installation script (link):

# msodbc.sh
case $(uname -m) in
    x86_64)   architecture="amd64" ;;
    arm64)   architecture="arm64" ;;
    *) architecture="unsupported" ;;
esac
if [[ "unsupported" == "$architecture" ]];
then
    echo "Alpine architecture $(uname -m) is not currently supported.";
    exit;
fi

#Download the desired package(s)
curl -O https://download.microsoft.com/download/3/5/5/355d7943-a338-41a7-858d-53b259ea33f5/msodbcsql18_18.3.3.1-1_$architecture.apk
curl -O https://download.microsoft.com/download/3/5/5/355d7943-a338-41a7-858d-53b259ea33f5/mssql-tools18_18.3.1.1-1_$architecture.apk

#(Optional) Verify signature, if 'gpg' is missing install it using 'apk add gnupg':
curl -O https://download.microsoft.com/download/3/5/5/355d7943-a338-41a7-858d-53b259ea33f5/msodbcsql18_18.3.3.1-1_$architecture.sig
curl -O https://download.microsoft.com/download/3/5/5/355d7943-a338-41a7-858d-53b259ea33f5/mssql-tools18_18.3.1.1-1_$architecture.sig

curl https://packages.microsoft.com/keys/microsoft.asc  | gpg --import -
gpg --verify msodbcsql18_18.3.3.1-1_$architecture.sig msodbcsql18_18.3.3.1-1_$architecture.apk
gpg --verify mssql-tools18_18.3.1.1-1_$architecture.sig mssql-tools18_18.3.1.1-1_$architecture.apk

#Install the package(s)
sudo apk add --allow-untrusted msodbcsql18_18.3.3.1-1_$architecture.apk
sudo apk add --allow-untrusted mssql-tools18_18.3.1.1-1_$architecture.apk

Sadly I see a lot of warning messages on the pages:

Warning: Trying to access array offset on null in /var/www/html/adminer.php on line 1452
Warning:  Trying to access array offset on null in /var/www/html/adminer.php on line 1771
Warning:  Trying to access array offset on null in /var/www/html/adminer.php on line 1772
Warning: Trying to access array offset on null in /var/www/html/adminer.php on line 1777