# Self-built Moodle image. See docs/requirements/015-moodle-self-built.md. # # Static Dockerfile — all dynamic values flow in as build ARGs from # compose.yml.j2, which derives them from roles/web-app-moodle/vars/main.yml. # That vars file is the single source of truth for: # - container paths (MOODLE_CODE_DIR, MOODLE_DATA_DIR, MOODLE_SOURCE_DIR, # MOODLE_ENTRYPOINT_PATH) # - build-asset names (MOODLE_BUILD_DIR, MOODLE_BUILD_FILES.*) # # The COPY src paths and the ENTRYPOINT JSON-array literal in this # file MUST stay in sync with vars/main.yml because Docker does not # expand ARG/ENV inside JSON-form ENTRYPOINT and only resolves COPY # src against the build context. Treat the literals below as a # locked-in contract — when you add or rename a build asset, update # vars/main.yml first and propagate here. ARG MOODLE_BASE_IMAGE ARG MOODLE_BASE_TAG FROM ${MOODLE_BASE_IMAGE}:${MOODLE_BASE_TAG} ARG MOODLE_CODE_DIR ARG MOODLE_DATA_DIR ARG MOODLE_LOCAL_CACHE_DIR ARG MOODLE_SOURCE_DIR ARG MOODLE_RUNTIME_USER ARG MOODLE_OIDC_ENABLED ARG MOODLE_OIDC_PLUGIN_RELPATH ARG MOODLE_MCP_ENABLED ARG MOODLE_MCP_PLUGIN_RELPATH ARG MOODLE_MCP_PLUGIN_ARCHIVE_URL ARG MOODLE_OIDC_PLUGIN_ARCHIVE_URL ARG MOODLE_RELEASE ARG MOODLE_TARBALL_URL ARG MOODLE_VERSION_FILE ARG MOODLE_AUTH_SUBDIR ARG MOODLE_WEBSERVICE_SUBDIR ENV MOODLE_CODE_DIR=${MOODLE_CODE_DIR} \ MOODLE_DATA_DIR=${MOODLE_DATA_DIR} \ MOODLE_LOCAL_CACHE_DIR=${MOODLE_LOCAL_CACHE_DIR} \ MOODLE_SOURCE_DIR=${MOODLE_SOURCE_DIR} \ MOODLE_RUNTIME_USER=${MOODLE_RUNTIME_USER} \ MOODLE_OIDC_PLUGIN_RELPATH=${MOODLE_OIDC_PLUGIN_RELPATH} \ MOODLE_MCP_PLUGIN_RELPATH=${MOODLE_MCP_PLUGIN_RELPATH} \ MOODLE_MCP_PLUGIN_ARCHIVE_URL=${MOODLE_MCP_PLUGIN_ARCHIVE_URL} \ MOODLE_OIDC_PLUGIN_ARCHIVE_URL=${MOODLE_OIDC_PLUGIN_ARCHIVE_URL} \ MOODLE_RELEASE=${MOODLE_RELEASE} \ MOODLE_TARBALL_URL=${MOODLE_TARBALL_URL} \ MOODLE_VERSION_FILE=${MOODLE_VERSION_FILE} \ MOODLE_AUTH_SUBDIR=${MOODLE_AUTH_SUBDIR} \ MOODLE_WEBSERVICE_SUBDIR=${MOODLE_WEBSERVICE_SUBDIR} # hadolint ignore=DL3008 RUN rm -rf /var/lib/apt/lists/* \ && apt-get -o Acquire::Retries=3 update \ && DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::Retries=3 install -y --no-install-recommends \ ca-certificates \ curl \ file \ gosu \ jq \ libfreetype6-dev \ libicu-dev \ libjpeg-dev \ libldap2-dev \ libonig-dev \ libpng-dev \ libpq-dev \ libwebp-dev \ libxml2-dev \ libxslt1-dev \ libzip-dev \ msmtp \ msmtp-mta \ unzip \ && rm -rf /var/lib/apt/lists/* RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-configure intl \ && docker-php-ext-configure ldap \ && docker-php-ext-install -j"$(nproc)" \ exif \ gd \ intl \ ldap \ mysqli \ opcache \ pgsql \ pdo_mysql \ pdo_pgsql \ soap \ xsl \ zip COPY build/php-conf/opcache-recommended.ini /usr/local/etc/php/conf.d/opcache-recommended.ini COPY build/php-conf/moodle-runtime.ini /usr/local/etc/php/conf.d/moodle-runtime.ini COPY build/php-conf/zz-moodle-pool.conf /usr/local/etc/php-fpm.d/zz-moodle-pool.conf COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY build/install/moodle-source.sh /tmp/install-moodle-source.sh RUN bash /tmp/install-moodle-source.sh && rm /tmp/install-moodle-source.sh COPY build/install/auth-oidc.sh /tmp/install-auth-oidc.sh RUN if [ "${MOODLE_OIDC_ENABLED}" = "1" ] || [ "${MOODLE_OIDC_ENABLED}" = "true" ]; then \ bash /tmp/install-auth-oidc.sh; \ fi \ && rm /tmp/install-auth-oidc.sh COPY build/install/webservice-mcp.sh /tmp/install-webservice-mcp.sh RUN if [ "${MOODLE_MCP_ENABLED}" = "1" ] || [ "${MOODLE_MCP_ENABLED}" = "true" ]; then \ bash /tmp/install-webservice-mcp.sh; \ fi \ && rm /tmp/install-webservice-mcp.sh COPY build/config.php ${MOODLE_SOURCE_DIR}/config.php RUN chown ${MOODLE_RUNTIME_USER}:${MOODLE_RUNTIME_USER} ${MOODLE_SOURCE_DIR}/config.php \ && chmod 0640 ${MOODLE_SOURCE_DIR}/config.php COPY build/moodle-entrypoint.sh /usr/local/bin/moodle-entrypoint.sh RUN chmod 0755 /usr/local/bin/moodle-entrypoint.sh ENTRYPOINT ["/usr/local/bin/moodle-entrypoint.sh"] CMD ["php-fpm"]