az

gzmoodle (6b41b34aaee59253e79ecb2f6a8e1ab356e0675d)

Published 2025-12-02 22:30:02 +01:00 by az

Installation

docker pull git.az-it.net/az/gzmoodle:6b41b34aaee59253e79ecb2f6a8e1ab356e0675d
sha256:435e45cec96b5bc5fccf06e5631e095c47036426e35186c224e94c9d0f823c2f

Image layers

# debian.sh --arch 'amd64' out/ 'trixie' '@1763337600'
RUN /bin/sh -c set -eux; { echo 'Package: php*'; echo 'Pin: release *'; echo 'Pin-Priority: -1'; } > /etc/apt/preferences.d/no-debian-php # buildkit
ENV PHPIZE_DEPS=autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c
RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends $PHPIZE_DEPS ca-certificates curl xz-utils ; apt-get dist-clean # buildkit
ENV PHP_INI_DIR=/usr/local/etc/php
RUN /bin/sh -c set -eux; mkdir -p "$PHP_INI_DIR/conf.d"; [ ! -d /var/www/html ]; mkdir -p /var/www/html; chown www-data:www-data /var/www/html; chmod 1777 /var/www/html # buildkit
ENV APACHE_CONFDIR=/etc/apache2
ENV APACHE_ENVVARS=/etc/apache2/envvars
RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends apache2; apt-get dist-clean; sed -ri 's/^export ([^=]+)=(.*)$/: ${\1:=\2}\nexport \1/' "$APACHE_ENVVARS"; . "$APACHE_ENVVARS"; for dir in "$APACHE_LOCK_DIR" "$APACHE_RUN_DIR" "$APACHE_LOG_DIR" "$APACHE_RUN_DIR/socks" ; do rm -rvf "$dir"; mkdir -p "$dir"; chown "$APACHE_RUN_USER:$APACHE_RUN_GROUP" "$dir"; chmod 1777 "$dir"; done; rm -rvf /var/www/html/*; ln -sfT /dev/stderr "$APACHE_LOG_DIR/error.log"; ln -sfT /dev/stdout "$APACHE_LOG_DIR/access.log"; ln -sfT /dev/stdout "$APACHE_LOG_DIR/other_vhosts_access.log"; chown -R --no-dereference "$APACHE_RUN_USER:$APACHE_RUN_GROUP" "$APACHE_LOG_DIR" # buildkit
RUN /bin/sh -c a2dismod mpm_event && a2enmod mpm_prefork # buildkit
RUN /bin/sh -c { echo '<FilesMatch \.php$>'; echo '\tSetHandler application/x-httpd-php'; echo '</FilesMatch>'; echo; echo 'DirectoryIndex disabled'; echo 'DirectoryIndex index.php index.html'; echo; echo '<Directory /var/www/>'; echo '\tOptions -Indexes'; echo '\tAllowOverride All'; echo '</Directory>'; } | tee "$APACHE_CONFDIR/conf-available/docker-php.conf" && a2enconf docker-php # buildkit
ENV PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
ENV PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
ENV PHP_LDFLAGS=-Wl,-O1 -pie
ENV GPG_KEYS=39B641343D8C104B2B146DC3F9C39DC0B9698544 E60913E4DF209907D8E30D96659A97C9CF2A795A 1198C0117593497A5EC5C199286AF1F9897469DC
ENV PHP_VERSION=8.2.29
ENV PHP_URL=https://www.php.net/distributions/php-8.2.29.tar.xz PHP_ASC_URL=https://www.php.net/distributions/php-8.2.29.tar.xz.asc
ENV PHP_SHA256=475f991afd2d5b901fb410be407d929bc00c46285d3f439a02c59e8b6fe3589c
RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends gnupg; apt-get dist-clean; mkdir -p /usr/src; cd /usr/src; curl -fsSL -o php.tar.xz "$PHP_URL"; if [ -n "$PHP_SHA256" ]; then echo "$PHP_SHA256 *php.tar.xz" | sha256sum -c -; fi; curl -fsSL -o php.tar.xz.asc "$PHP_ASC_URL"; export GNUPGHOME="$(mktemp -d)"; for key in $GPG_KEYS; do gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; done; gpg --batch --verify php.tar.xz.asc php.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME"; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark > /dev/null; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false # buildkit
COPY docker-php-source /usr/local/bin/ # buildkit
RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends apache2-dev libargon2-dev libcurl4-openssl-dev libonig-dev libreadline-dev libsodium-dev libsqlite3-dev libssl-dev libxml2-dev zlib1g-dev ; export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" PHP_BUILD_PROVIDER='https://github.com/docker-library/php' PHP_UNAME='Linux - Docker' ; docker-php-source extract; cd /usr/src/php; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; if [ ! -d /usr/include/curl ]; then ln -sT "/usr/include/$debMultiarch/curl" /usr/local/include/curl; fi; ./configure --build="$gnuArch" --with-config-file-path="$PHP_INI_DIR" --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" --enable-option-checking=fatal --with-mhash --with-pic --enable-mbstring --enable-mysqlnd --with-password-argon2 --with-sodium=shared --with-pdo-sqlite=/usr --with-sqlite3=/usr --with-curl --with-iconv --with-openssl --with-readline --with-zlib --disable-phpdbg --with-pear $(test "$gnuArch" = 'riscv64-linux-gnu' && echo '--without-pcre-jit') --with-libdir="lib/$debMultiarch" --disable-cgi --with-apxs2 ; make -j "$(nproc)"; find -type f -name '*.a' -delete; make install; find /usr/local -type f -perm '/0111' -exec sh -euxc ' strip --strip-all "$@" || : ' -- '{}' + ; make clean; cp -v php.ini-* "$PHP_INI_DIR/"; cd /; docker-php-source delete; apt-mark auto '.*' > /dev/null; [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; find /usr/local -type f -executable -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' | sort -u | xargs -rt dpkg-query --search | awk 'sub(":$", "", $1) { print $1 }' | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; apt-get dist-clean; pecl update-channels; rm -rf /tmp/pear ~/.pearrc; php --version # buildkit
COPY docker-php-ext-* docker-php-entrypoint /usr/local/bin/ # buildkit
RUN /bin/sh -c docker-php-ext-enable opcache # buildkit
RUN /bin/sh -c docker-php-ext-enable sodium # buildkit
ENTRYPOINT ["docker-php-entrypoint"]
STOPSIGNAL SIGWINCH
COPY apache2-foreground /usr/local/bin/ # buildkit
WORKDIR /var/www/html
EXPOSE map[80/tcp:{}]
CMD ["apache2-foreground"]
ARG MOODLE_VERSION=5.1.0
ARG TIMEZONE=${TIMEZONE:-Europe/Berlin}
ARG PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M}
ARG PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M}
ARG PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M}
ARG PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000}
ARG LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8}
ENV MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} LANG=${LOCALE_DEFAULT:-de_DE.UTF-8} LC_ALL=${LOCALE_DEFAULT:-de_DE.UTF-8} DEBIAN_FRONTEND=noninteractive
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends cron git wget curl zip unzip tzdata libicu-dev locales libpng-dev libjpeg-dev libfreetype6-dev libxml2-dev zlib1g-dev libzip-dev libldap2-dev libsasl2-modules libsasl2-dev libwebp-dev libonig-dev dpkg-dev; multiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp; docker-php-ext-configure ldap --with-libdir="lib/${multiarch}"; docker-php-ext-install -j"$(nproc)" mysqli pdo_mysql intl gd ldap zip opcache soap xml mbstring exif; a2enmod rewrite; rm -rf /var/lib/apt/lists/* # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; ln -snf "/usr/share/zoneinfo/${TIMEZONE}" /etc/localtime; echo "${TIMEZONE}" > /etc/timezone; for loc in de_DE.UTF-8 en_US.UTF-8 en_AU.UTF-8 "${LOCALE_DEFAULT}"; do [ -z "$loc" ] && continue; line="${loc} UTF-8"; if ! grep -q "^${line}" /etc/locale.gen; then echo "${line}" >> /etc/locale.gen; else sed -i "s/^# *${line}/${line}/" /etc/locale.gen; fi; done; locale-gen || locale-gen --purge; update-locale LANG=${LOCALE_DEFAULT} || true; { echo "[PHP]"; echo "date.timezone=${TIMEZONE}"; echo "memory_limit=${PHP_MEMORY_LIMIT}"; echo "upload_max_filesize=${PHP_UPLOAD_MAX_FILESIZE}"; echo "post_max_size=${PHP_POST_MAX_SIZE}"; echo "max_input_vars=${PHP_MAX_INPUT_VARS}"; } > /usr/local/etc/php/conf.d/moodle.ini # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; : "${MOODLE_VERSION:?MOODLE_VERSION build arg required}"; git_branch="$(echo "${MOODLE_VERSION}" | awk -F. '{printf "MOODLE_%01d%02d_STABLE", $1, $2}')"; rm -rf /var/www/html/*; git clone --depth 1 --branch "${git_branch}" https://github.com/moodle/moodle.git /var/www/html; if git -C /var/www/html ls-remote --exit-code --tags origin "v${MOODLE_VERSION}" >/dev/null 2>&1; then git -C /var/www/html fetch --depth 1 origin "v${MOODLE_VERSION}"; git -C /var/www/html checkout "v${MOODLE_VERSION}"; fi; curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php; php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer; rm -f /tmp/composer-setup.php; export COMPOSER_ALLOW_SUPERUSER=1; cd /var/www/html; composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction; cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini; echo "include_path=\".:/usr/local/lib/php\"" >> /usr/local/etc/php/php.ini; echo "include_dir=\"/usr/local/etc/php/conf.d\"" >> /usr/local/etc/php/php.ini; chown -R www-data:www-data /var/www/html # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; mkdir -p /var/www/moodledata; chown -R www-data:www-data /var/www/moodledata; chmod 0770 /var/www/moodledata # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; echo "* * * * * www-data /usr/local/bin/php -f /var/www/html/admin/cli/cron.php >/var/log/moodle-cron.log 2>&1" > /etc/cron.d/moodle; chmod 0644 /etc/cron.d/moodle; crontab -u www-data /etc/cron.d/moodle; touch /var/log/moodle-cron.log; chown www-data:www-data /var/log/moodle-cron.log # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c set -eux; cat >/usr/local/bin/start-moodle.sh <<'EOF' #!/bin/bash set -e # Ensure moodledata exists with correct ownership (bind-mount may override build-time perms). mkdir -p /var/www/moodledata chown -R www-data:www-data /var/www/moodledata chmod 0770 /var/www/moodledata # Ensure locale env is sane at runtime (in case host env is missing) and locale exists. if ! locale -a 2>/dev/null | grep -qi "${LOCALE_DEFAULT:-en_US.UTF-8}"; then echo "Warning: locale ${LOCALE_DEFAULT:-en_US.UTF-8} not generated, falling back to en_US.UTF-8" LOCALE_DEFAULT="en_US.UTF-8" fi export LANG="${LOCALE_DEFAULT}" export LC_ALL="${LOCALE_DEFAULT}" export TIMEZONE="${TIMEZONE:-Europe/Berlin}" export PHP_MEMORY_LIMIT="${PHP_MEMORY_LIMIT:-512M}" export PHP_UPLOAD_MAX_FILESIZE="${PHP_UPLOAD_MAX_FILESIZE:-200M}" export PHP_POST_MAX_SIZE="${PHP_POST_MAX_SIZE:-200M}" export PHP_MAX_INPUT_VARS="${PHP_MAX_INPUT_VARS:-5000}" # Regenerate PHP runtime ini from env to avoid empty defaults/warnings. cat >/usr/local/etc/php/conf.d/zzz-moodle-runtime.ini <<PHPCFG [PHP] date.timezone=${TIMEZONE} memory_limit=${PHP_MEMORY_LIMIT} upload_max_filesize=${PHP_UPLOAD_MAX_FILESIZE} post_max_size=${PHP_POST_MAX_SIZE} max_input_vars=${PHP_MAX_INPUT_VARS} PHPCFG # Web root (newer releases expose /public), CLI stays under /var/www/html MOODLE_BASE=/var/www/html DOCROOT=/var/www/html if [ -d /var/www/html/public ]; then DOCROOT=/var/www/html/public fi # Adjust Apache DocumentRoot dynamically. for f in /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/default-ssl.conf; do sed -i "s|^[[:space:]]*DocumentRoot[[:space:]].*|DocumentRoot ${DOCROOT}|g" "$f" done a2dissite 000-default >/dev/null 2>&1 || true a2ensite 000-default >/dev/null 2>&1 || true apache2ctl configtest || { cat /etc/apache2/sites-available/000-default.conf; exit 1; } # Auto-generate config.php from env vars if it does not yet exist, or refresh it if it was auto-generated and dirroot changed. CONFIG_MARKER="### AUTO-GENERATED BY MOODLE ENTRYPOINT" needs_config_write=0 if [ ! -f /var/www/html/config.php ]; then needs_config_write=1 elif grep -q "${CONFIG_MARKER}" /var/www/html/config.php; then if ! grep -q "^\$CFG->dirroot *= *'${MOODLE_BASE}'" /var/www/html/config.php; then echo "Detected auto-generated config with mismatched dirroot; rewriting for ${MOODLE_BASE}" needs_config_write=1 fi if ! grep -q "^\$CFG->reverseproxy" /var/www/html/config.php || ! grep -q "^\$CFG->sslproxy" /var/www/html/config.php; then echo "Detected auto-generated config missing proxy flags; rewriting." needs_config_write=1 fi fi if [ "$needs_config_write" -eq 1 ]; then echo "Generating config.php from environment..." cat >/var/www/html/config.php <<CONFIG <?php ${CONFIG_MARKER} unset(\$CFG); global \$CFG; \$CFG = new stdClass(); \$CFG->dirroot = '${MOODLE_BASE}'; \$CFG->libdir = \$CFG->dirroot . '/lib'; \$CFG->dbtype = '${MOODLE_DBTYPE}'; \$CFG->dblibrary = 'native'; \$CFG->dbhost = '${MOODLE_DBHOST}'; \$CFG->dbname = '${MOODLE_DBNAME}'; \$CFG->dbuser = '${MOODLE_DBUSER}'; \$CFG->dbpass = '${MOODLE_DBPASS}'; \$CFG->prefix = 'mdl_'; \$CFG->dboptions = array ( 'dbpersist' => 0, 'dbport' => '', 'dbsocket' => '', 'dbcollation' => 'utf8mb4_unicode_ci', ); \$CFG->wwwroot = '${MOODLE_WWWROOT}'; \$CFG->dataroot = '/var/www/moodledata'; \$CFG->directorypermissions = 02770; \$CFG->admin = 'admin'; \$CFG->lang = '${MOODLE_LANG}'; \$CFG->reverseproxy = true; \$CFG->sslproxy = true; \$proxylist = array_filter(array_map('trim', explode(',', (string)getenv('REVERSEPROXY_ADDRESSES')))); if (!empty(\$proxylist)) { \$CFG->reverseproxyaddresses = \$proxylist; } require_once(__DIR__ . '/lib/setup.php'); CONFIG chown www-data:www-data /var/www/html/config.php fi # Auto-upgrade only when code changed (tracked via hash) AND DB already has config table. codehash_file=/var/www/moodledata/.codehash current_hash=$(find "${MOODLE_BASE}" -maxdepth 2 -type f -printf '%P %T@\\n' | sha256sum | cut -d' ' -f1) db_initialized=0 wait_db=${WAIT_FOR_DATABASE:-5} retry=0 max_retries=${WAIT_FOR_DATABASE:-5} if [ ! -f "$codehash_file" ] || [ "$(cat "$codehash_file")" != "$current_hash" ]; then echo "Code change detected; checking if DB is initialized..." cat >/tmp/moodle-db-check.php <<'PHP' <?php define('CLI_SCRIPT', true); require '/var/www/html/config.php'; global $CFG; $prefix = isset($CFG->prefix) ? $CFG->prefix : 'mdl_'; $mysqli = new mysqli(getenv('MOODLE_DBHOST'), getenv('MOODLE_DBUSER'), getenv('MOODLE_DBPASS'), getenv('MOODLE_DBNAME')); if ($mysqli->connect_errno) { fwrite(STDERR, "DB connect failed: {$mysqli->connect_error}\n"); exit(2); } $res = $mysqli->query("SHOW TABLES LIKE '{$prefix}config'"); exit($res && $res->num_rows ? 0 : 1); PHP while [ "$retry" -lt "$max_retries" ]; do if su -s /bin/bash www-data -c "/usr/local/bin/php /tmp/moodle-db-check.php"; then db_initialized=1 echo "DB initialized, running upgrade..." su -s /bin/bash www-data -c "/usr/local/bin/php ${MOODLE_BASE}/admin/cli/upgrade.php --non-interactive" echo "Purging caches..." su -s /bin/bash www-data -c "/usr/local/bin/php ${MOODLE_BASE}/admin/cli/purge_caches.php" echo "$current_hash" > "$codehash_file" break else rc=$? retry=$((retry+1)) if [ "$rc" -eq 1 ]; then echo "Attempt $retry/$max_retries: DB not initialized yet (no config table); waiting 1s..." else echo "Attempt $retry/$max_retries: DB check failed (rc=$rc); waiting 1s..." fi sleep 1 fi done if [ "$db_initialized" -eq 0 ]; then echo "DB not ready after $max_retries attempts; skipping upgrade/purge." fi rm -f /tmp/moodle-db-check.php else echo "No code changes detected; skipping upgrade/purge." fi # Ensure language pack is present once DB is ready. Download directly to moodledata/lang if missing. if [ "$db_initialized" -eq 1 ]; then mkdir -p /var/www/moodledata/lang # Build list: default MOODLE_LANG plus comma-separated MOODLE_LANGPACKS langs="${MOODLE_LANG}" if [ -n "${MOODLE_LANGPACKS:-}" ]; then langs="${langs},${MOODLE_LANGPACKS}" fi # Normalize and dedupe langs=$(echo "$langs" | tr ',' '\n' | awk 'NF {gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0); if(!seen[$0]++) print $0}') # Prepare base version/branch for langpacks base_ver=$(php -r "require '/var/www/html/version.php'; if(isset(\$version->release)){ \$parts=explode('.', trim(\$version->release)); printf('%d.%d', \$parts[0], \$parts[1]); }") [ -z "$base_ver" ] && base_ver="$(echo "${MOODLE_VERSION:-}" | awk -F. '{printf "%d.%d", $1, $2}')" base_url="https://download.moodle.org/download.php/langpack/${base_ver}" git_branch=$(php -r "require '/var/www/html/version.php'; if(isset(\$version->branch)){printf('MOODLE_%03d_STABLE', \$version->branch);}"); \ if [ -z "$git_branch" ]; then \ git_branch=$(php -r "if (preg_match('/^(\\d+)\\.(\\d+)/', getenv('MOODLE_VERSION'), \$m)) printf('MOODLE_%01d%02d_STABLE', \$m[1], \$m[2]);"); fi tmp_langpack="" # Prefer git clone of langpack repo once; fall back to direct download per lang. if git clone --depth 1 --branch "${git_branch}" https://github.com/moodlehq/moodle-langpack.git /tmp/langpack; then tmp_langpack="/tmp/langpack" else echo "Git langpack clone failed for branch ${git_branch}; will try direct downloads." fi for lang in $langs; do [ -z "$lang" ] && continue if [ -d "/var/www/moodledata/lang/${lang}" ]; then echo "Language pack ${lang} already present, skipping." continue fi if [ -n "$tmp_langpack" ] && [ -d "${tmp_langpack}/${lang}" ]; then echo "Installing language pack ${lang} from git mirror branch ${git_branch}..." cp -r "${tmp_langpack}/${lang}" /var/www/moodledata/lang/ chown -R www-data:www-data "/var/www/moodledata/lang/${lang}" echo "Language pack ${lang} installed from git mirror." else url="${base_url}/${lang}.zip" echo "Git mirror missing ${lang}, trying download ${url}..." if su -s /bin/bash www-data -c "curl -fL --fail '${url}' -o /tmp/lang.zip"; then su -s /bin/bash www-data -c "unzip -o /tmp/lang.zip -d /var/www/moodledata/lang" rm -f /tmp/lang.zip echo "Language pack ${lang} installed from download." else echo "Language install skipped: could not fetch ${lang} from git or ${url}" rm -f /tmp/lang.zip || true fi fi done if [ -n "$tmp_langpack" ]; then rm -rf "$tmp_langpack"; fi chown -R www-data:www-data /var/www/moodledata/lang fi service cron start exec apache2-foreground EOF # buildkit
RUN |7 MOODLE_VERSION=5.1.0 TIMEZONE=${TIMEZONE:-Europe/Berlin} PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-512M} PHP_UPLOAD_MAX_FILESIZE=${PHP_UPLOAD_MAX_FILESIZE:-200M} PHP_POST_MAX_SIZE=${PHP_POST_MAX_SIZE:-200M} PHP_MAX_INPUT_VARS=${PHP_MAX_INPUT_VARS:-5000} LOCALE_DEFAULT=${LOCALE_DEFAULT:-de_DE.UTF-8} /bin/sh -c chmod +x /usr/local/bin/start-moodle.sh # buildkit
CMD ["/usr/local/bin/start-moodle.sh"]
Details
Container
2025-12-02 22:30:02 +01:00
1
OCI / Docker
linux/amd64
389 MiB
Versions (14) View all