diff --git a/phpmyadmin/arm/Dockerfile b/phpmyadmin/arm/Dockerfile index d76363c..95663be 100644 --- a/phpmyadmin/arm/Dockerfile +++ b/phpmyadmin/arm/Dockerfile @@ -1,44 +1,126 @@ -# -# Dockerfile for phpmyadmin-arm -# - -FROM easypi/alpine-arm -MAINTAINER EasyPi Software Foundation +FROM php:8.0-apache # Install dependencies -RUN apk add --no-cache php7-session php7-mysqli php7-mbstring php7-xml php7-gd php7-zlib php7-bz2 php7-zip php7-openssl php7-curl php7-opcache php7-json nginx php7-fpm supervisor +RUN set -ex; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + libbz2-dev \ + libfreetype6-dev \ + libjpeg-dev \ + libpng-dev \ + libwebp-dev \ + libxpm-dev \ + libzip-dev \ + ; \ + \ + docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm; \ + docker-php-ext-install -j "$(nproc)" \ + bz2 \ + gd \ + mysqli \ + opcache \ + zip \ + ; \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark; \ + ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \ + | awk '/=>/ { print $3 }' \ + | sort -u \ + | xargs -r dpkg-query -S \ + | cut -d: -f1 \ + | sort -u \ + | xargs -rt apt-mark manual; \ + \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/* + +# set recommended PHP.ini settings +# see https://secure.php.net/manual/en/opcache.installation.php +ENV MAX_EXECUTION_TIME 600 +ENV MEMORY_LIMIT 512M +ENV UPLOAD_LIMIT 2048K +RUN set -ex; \ + \ + { \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=4000'; \ + echo 'opcache.revalidate_freq=2'; \ + echo 'opcache.fast_shutdown=1'; \ + } > $PHP_INI_DIR/conf.d/opcache-recommended.ini; \ + \ + { \ + echo 'session.cookie_httponly=1'; \ + echo 'session.use_strict_mode=1'; \ + } > $PHP_INI_DIR/conf.d/session-strict.ini; \ + \ + { \ + echo 'allow_url_fopen=Off'; \ + echo 'max_execution_time=${MAX_EXECUTION_TIME}'; \ + echo 'max_input_vars=10000'; \ + echo 'memory_limit=${MEMORY_LIMIT}'; \ + echo 'post_max_size=${UPLOAD_LIMIT}'; \ + echo 'upload_max_filesize=${UPLOAD_LIMIT}'; \ + } > $PHP_INI_DIR/conf.d/phpmyadmin-misc.ini # Calculate download URL -ENV VERSION 4.7.5 -ENV URL https://files.phpmyadmin.net/phpMyAdmin/${VERSION}/phpMyAdmin-${VERSION}-all-languages.tar.gz -LABEL version=$VERSION +ENV VERSION 5.1.1 +ENV SHA256 1964d7190223c11e89fa1b7970c618e3a3bae2e859f5f60383f64c3848ef6921 +ENV URL https://files.phpmyadmin.net/phpMyAdmin/${VERSION}/phpMyAdmin-${VERSION}-all-languages.tar.xz + +LABEL org.opencontainers.image.title="Official phpMyAdmin Docker image" \ + org.opencontainers.image.description="Run phpMyAdmin with Alpine, Apache and PHP FPM." \ + org.opencontainers.image.authors="The phpMyAdmin Team " \ + org.opencontainers.image.vendor="phpMyAdmin" \ + org.opencontainers.image.documentation="https://github.com/phpmyadmin/docker#readme" \ + org.opencontainers.image.licenses="GPL-2.0-only" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.url="https://github.com/phpmyadmin/docker#readme" \ + org.opencontainers.image.source="https://github.com/phpmyadmin/docker.git" # Download tarball, verify it using gpg and extract -RUN set -x \ - && GNUPGHOME="$(mktemp -d)" \ - && export GNUPGHOME \ - && apk add --no-cache curl gnupg tar \ - && curl -sSL https://github.com/phpmyadmin/docker/archive/${VERSION}-1.tar.gz | \ - tar xz --strip 1 -C / docker-${VERSION}-1/etc docker-${VERSION}-1/run.sh docker-${VERSION}-1/phpmyadmin.keyring \ - && curl --output phpMyAdmin.tar.gz --location $URL \ - && curl --output phpMyAdmin.tar.gz.asc --location $URL.asc \ - && gpgv --keyring /phpmyadmin.keyring phpMyAdmin.tar.gz.asc phpMyAdmin.tar.gz \ - && apk del --no-cache curl gnupg tar \ - && rm -rf "$GNUPGHOME" \ - && tar xzf phpMyAdmin.tar.gz \ - && rm -f phpMyAdmin.tar.gz phpMyAdmin.tar.gz.asc \ - && mv phpMyAdmin-$VERSION-all-languages /www \ - && rm -rf /www/setup/ /www/examples/ /www/test/ /www/po/ /www/composer.json /www/RELEASE-DATE-$VERSION \ - && sed -i "s@define('CONFIG_DIR'.*@define('CONFIG_DIR', '/etc/phpmyadmin/');@" /www/libraries/vendor_config.php \ - && chown -R root:nobody /www \ - && find /www -type d -exec chmod 750 {} \; \ - && find /www -type f -exec chmod 640 {} \; +RUN set -ex; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + gnupg \ + dirmngr \ + ; \ + \ + export GNUPGHOME="$(mktemp -d)"; \ + export GPGKEY="3D06A59ECE730EB71B511C17CE752F178259BD92"; \ + curl -fsSL -o phpMyAdmin.tar.xz $URL; \ + curl -fsSL -o phpMyAdmin.tar.xz.asc $URL.asc; \ + echo "$SHA256 *phpMyAdmin.tar.xz" | sha256sum -c -; \ + gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$GPGKEY" \ + || gpg --batch --keyserver pgp.mit.edu --recv-keys "$GPGKEY" \ + || gpg --batch --keyserver keyserver.pgp.com --recv-keys "$GPGKEY" \ + || gpg --batch --keyserver keys.openpgp.org --recv-keys "$GPGKEY"; \ + gpg --batch --verify phpMyAdmin.tar.xz.asc phpMyAdmin.tar.xz; \ + tar -xf phpMyAdmin.tar.xz -C /var/www/html --strip-components=1; \ + mkdir -p /var/www/html/tmp; \ + chown www-data:www-data /var/www/html/tmp; \ + gpgconf --kill all; \ + rm -r "$GNUPGHOME" phpMyAdmin.tar.xz phpMyAdmin.tar.xz.asc; \ + rm -r -v /var/www/html/setup/ /var/www/html/examples/ /var/www/html/js/src/ /var/www/html/templates/test/ /var/www/html/babel.config.json /var/www/html/doc/html/_sources/ /var/www/html/RELEASE-DATE-$VERSION /var/www/html/CONTRIBUTING.md; \ + sed -i "s@define('CONFIG_DIR'.*@define('CONFIG_DIR', '/etc/phpmyadmin/');@" /var/www/html/libraries/vendor_config.php; \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/* -# Add directory for sessions to allow session persistence -RUN mkdir /sessions +# Copy configuration +COPY config.inc.php /etc/phpmyadmin/config.inc.php -# We expose phpMyAdmin on port 80 -EXPOSE 80 +# Copy main script +COPY docker-entrypoint.sh /docker-entrypoint.sh -ENTRYPOINT [ "/run.sh" ] -CMD ["phpmyadmin"] +ENTRYPOINT [ "/docker-entrypoint.sh" ] +CMD ["apache2-foreground"] diff --git a/phpmyadmin/arm/config.inc.php b/phpmyadmin/arm/config.inc.php new file mode 100644 index 0000000..3af4b69 --- /dev/null +++ b/phpmyadmin/arm/config.inc.php @@ -0,0 +1,152 @@ + /etc/phpmyadmin/config.secret.inc.php < $PHP_INI_DIR/conf.d/phpmyadmin-hide-php-version.ini +fi + +if [ ! -z "${PMA_CONFIG_BASE64}" ]; then + echo "Adding the custom config.inc.php from base64." + echo "${PMA_CONFIG_BASE64}" | base64 -d > /etc/phpmyadmin/config.inc.php +fi + +if [ ! -z "${PMA_USER_CONFIG_BASE64}" ]; then + echo "Adding the custom config.user.inc.php from base64." + echo "${PMA_USER_CONFIG_BASE64}" | base64 -d > /etc/phpmyadmin/config.user.inc.php +fi + +get_docker_secret() { + local env_var="${1}" + local env_var_file="${env_var}_FILE" + + # Check if the variable with name $env_var_file (which is $PMA_PASSWORD_FILE for example) + # is not empty and export $PMA_PASSWORD as the password in the Docker secrets file + + if [[ -n "${!env_var_file}" ]]; then + export "${env_var}"="$(cat "${!env_var_file}")" + fi +} + +get_docker_secret PMA_PASSWORD +get_docker_secret MYSQL_ROOT_PASSWORD +get_docker_secret MYSQL_PASSWORD +get_docker_secret PMA_HOSTS +get_docker_secret PMA_HOST +get_docker_secret PMA_CONTROLPASS + +exec "$@" diff --git a/phpmyadmin/docker-compose.yml b/phpmyadmin/docker-compose.yml index 658387e..d00ba6b 100644 --- a/phpmyadmin/docker-compose.yml +++ b/phpmyadmin/docker-compose.yml @@ -1,8 +1,9 @@ -phpmyadmin: - image: phpmyadmin/phpmyadmin - ports: - - "8080:80" - environment: - - PMA_HOST=dbhost - - PMA_PORT=3306 - restart: always +version: "3.8" +services: + phpmyadmin: + image: phpmyadmin/phpmyadmin + ports: + - "8080:80" + environment: + - PMA_ARBITRARY=1 + restart: unless-stopped