
!Docker Image Size !nginx 1.26 !php 8.3 !moodle !moosh 1.27 !License MIT !https://github.com/erseco/alpine-moodle/actions/workflows/build.yml/badge.svg
基于Alpine Linux构建的轻量级Moodle Docker镜像(约100MB)。
仓库地址:https://github.com/erseco/alpine-moodle
docker compose.ymldocker logs -f <容器名>查看)MOODLE_USERNAME和MOODLE_PASSWORD覆盖为安全值。/public目录提供文件服务。publicpaths.php应用兼容性补丁,以支持容器内的端口映射。Moodle 5.1引入了新的/public目录用于所有Web可访问文件。如果从5.0或更早版本升级:
config.phpmoodledata/目录/var/www/html/下的所有剩余文件,避免陈旧或冲突代码。config.php和自定义插件/主题复制到新代码库。/public目录时,容器会自动执行composer install。从Docker Hub获取:
bashdocker compose up
使用环境变量定义的凭据登录。
从GHCR获取:
yamlservices: moodle: image: ghcr.io/erseco/alpine-moodle # 其余配置...
在某些情况下,可能需要在Moodle容器内以root用户运行命令(例如安装额外包),可使用docker compose exec命令并指定--user root选项:
bashdocker compose exec --user root moodle sh
在docker compose.yml文件中定义环境变量
| 变量名 | 默认值 | 描述 |
|---|---|---|
| LANG | en_US.UTF-8 | 语言设置 |
| LANGUAGE | en_US:en | 语言偏好 |
| SITE_URL | http://localhost | 设置公共站点URL |
| REVERSEPROXY | false | 详见反向代理配置 |
| SSLPROXY | false | 详见反向代理配置 |
| REDIS_HOST | Redis实例主机名,例如redis | |
| DB_TYPE | pgsql | 数据库类型:mysqli、pgsql、mariadb |
| DB_HOST | postgres | 数据库主机,例如db容器名 |
| DB_PORT | 5432 | 数据库端口:Postgres=5432,MySQL=3306 |
| DB_NAME | moodle | 数据库名 |
| DB_USER | moodle | 数据库用户名 |
| DB_FETCHBUFFERSIZE | 若使用PgBouncer等PostgreSQL连接池(事务模式),设置为0 | |
| DB_DBHANDLEOPTIONS | false | 若使用不支持发送选项的PostgreSQL连接池(如PgBouncer),设置为true |
| DB_HOST_REPLICA | 只读副本数据库主机名 | |
| DB_PORT_REPLICA | 副本数据库端口,留空则与DB_PORT相同 | |
| DB_USER_REPLICA | 副本数据库用户名,留空则与DB_USER相同 | |
| DB_PASS_REPLICA | 副本数据库密码,留空则与DB_PASS相同 | |
| DB_PREFIX | mdl_ | 数据库前缀。警告:不要使用数值,否则Moodle无法启动 |
| MY_CERTIFICATES | none | 经过base64编码的可信LDAP证书或证书链 |
| MOODLE_EMAIL | *** | Moodle管理员*** |
| MOODLE_LANGUAGE | en | Moodle界面语言 |
| MOODLE_SITENAME | New-Site | 站点名称 |
| MOODLE_USERNAME | moodleuser | 管理员用户名 |
| MOODLE_PASSWORD | PLEASE_CHANGEME | 管理员密码 |
| SMTP_HOST | smtp.gmail.com | SMTP服务器主机 |
| SMTP_PORT | 587 | SMTP服务器端口 |
| SMTP_USER | *** | SMTP用户名 |
| SMTP_PASSWORD | your_password | SMTP密码 |
| SMTP_PROTOCOL | tls | SMTP协议 |
| MOODLE_MAIL_NOREPLY_ADDRESS | noreply@localhost | noreply***地址 |
| MOODLE_MAIL_PREFIX | [moodle] | 邮件前缀 |
| AUTO_UPDATE_MOODLE | true | 设置为false可禁用Docker启动时执行Moodle更新(如插件) |
| DEBUG | false | 调试模式开关 |
| client_max_body_size | 50M | Nginx客户端最大请求体大小 |
| post_max_size | 50M | PHP POST数据最大大小 |
| upload_max_filesize | 50M | PHP上传文件最大大小 |
| max_input_vars | 5000 | PHP最大输入变量数 |
| PRE_CONFIGURE_COMMANDS | 配置开始前运行的命令 | |
| POST_CONFIGURE_COMMANDS | 配置完成后运行的命令 | |
| RUN_CRON_TASKS | true | 设置为false可禁用自动运行Moodle Cron任务 |
当使用反向代理(如Caddy、Traefik、nginx-proxy-manager)处理SSL终止时,可能会遇到CSS丢失或“重定向过多”错误。这是常见问题,可通过正确配置解决。
CSS丢失:若SITE_URL设为内部Docker IP(如http://172.19.0.1:89),Moodle会生成带内部地址的URL。当浏览器通过https://moodle.example.com访问时,会因混合内容(尝试加载http内容到https页面)阻止这些资源。
ERR_TOO_MANY_REDIRECTS:若SITE_URL设为公共HTTPS地址(如https://moodle.example.com)但未正确配置代理设置,Moodle可能会混淆协议并进入重定向循环。
关键是告知Moodle其位于SSL终止代理之后。可通过以下环境变量设置解决:
SITE_URL:设为公共外部URL,带https协议(如https://moodle.example.com)。REVERSEPROXY:大多数反向代理设置保持false。仅当Moodle有意通过多个不同基础URL访问(如用户使用不同域名或协议)时设为true。在典型反向代理场景(所有用户通过单一公共URL访问)中保持false。详见Moodle反向代理文档。SSLPROXY:设为true。告知Moodle信任代理发送的X-Forwarded-Proto头,理解连接是安全的(即使与Docker容器的内部连接为HTTP)。以下是docker-compose.yml和Caddyfile的反向代理配置示例。
docker-compose.yml
yamlservices: moodle: image: erseco/alpine-moodle restart: unless-stopped environment: SITE_URL: https://moodle.example.com REVERSEPROXY: "false" SSLPROXY: "true" # ... 其他环境变量 volumes: - moodledata:/var/www/moodledata - moodlehtml:/var/www/html depends_on: - postgres # ... 其他服务(postgres等) volumes: moodledata: moodlehtml:
Caddyfile
caddymoodle.example.com { reverse_proxy moodle:8080 { header_up Host {host} header_up X-Forwarded-Proto {scheme} header_up X-Forwarded-For {remote} } }
通过此配置可避免Moodle在反向代理后的常见问题。详见issue https://github.com/erseco/alpine-moodle/issues/101%E3%80%82
yaml--- services: postgres: image: postgres:alpine restart: unless-stopped environment: - POSTGRES_PASSWORD=moodle - POSTGRES_USER=moodle - POSTGRES_DB=moodle volumes: - postgres:/var/lib/postgresql/data moodle: image: erseco/alpine-moodle restart: unless-stopped environment: MOODLE_USERNAME: moodleuser MOODLE_PASSWORD: PLEASE_CHANGEME ports: - 80:8080 volumes: - moodledata:/var/www/moodledata - moodlehtml:/var/www/html depends_on: - postgres volumes: postgres: null moodledata: null moodlehtml: null
此镜像包含https://github.com/tmuras/moosh%E2%80%94%E2%80%94%E5%BC%BA%E5%A4%A7%E7%9A%84Moodle%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E3%80%82%E5%8F%AF%E9%80%9A%E8%BF%87%E4%BB%A5%E4%B8%8B%E5%91%BD%E4%BB%A4%E8%B0%83%E7%94%A8%E4%BB%BB%E4%BD%95Moosh%E5%91%BD%E4%BB%A4%EF%BC%9A
bashdocker compose exec moodle moosh <命令>
示例:
升级插件列表(安装前需执行)
bashdocker compose exec moodle moosh plugin-list
按名称安装插件
bashdocker compose exec moodle moosh plugin-install mod_attendance
可使用
--force选项强制安装不支持的插件。
注意:https://github.com/tmuras/moosh/issues/520%EF%BC%8C%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%60--delete%60%E6%A0%87%E5%BF%97%E9%87%8D%E6%96%B0%E8%B0%83%E7%94%A8%E5%AE%89%E8%A3%85%E5%87%BD%E6%95%B0%E6%88%96%E4%BD%BF%E7%94%A8%60module-reinstall%60%E9%80%89%E9%A1%B9%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%9A%60docker compose exec moodle moosh plugin-install --delete theme_almondb
或docker compose exec moodle moosh module-reinstall theme_almondb`
备份课程
按ID备份课程。默认排除日志和成绩历史。
示例:备份ID=3的课程到容器内/opt/moosh/目录的默认.mbz文件:
bashdocker compose exec moodle moosh course-backup 3
创建用户
创建新Moodle用户。提供一个或多个参数可创建多个用户。
示例:创建用户“testuser”并设置所有可选值
bashdocker compose exec moodle moosh user-create --password pass --email me@example.com --digest 2 --city Valverde --country ES --institution "IES Garoé" --department "Technology" --firstname "first name" --lastname name testuser
删除用户
从Moodle删除用户。提供一个或多个用户名为参数。
示例:删除用户testuser
bashdocker compose exec moodle moosh user-delete testuser
这些示例可直接包含在POST_CONFIGURE_COMMANDS中,以自动化插件安装、备份或任何Moosh支持的功能。
使用Moosh可遵循DRY原则(避免重复),并利用强大的Moodle管理工具集。
完整命令列表见:[***]
可通过PRE_CONFIGURE_COMMANDS和POST_CONFIGURE_COMMANDS环境变量定义在Moodle配置前后执行的命令。适用于安装额外包或运行脚本等任务。
yamlenvironment: PRE_CONFIGURE_COMMANDS: "cat config-dist.php" POST_CONFIGURE_COMMANDS: | moosh plugin-list moosh plugin-install --delete theme_almondb moosh plugin-install --delete theme_almondb
调用docker compose build会使用Moodle主分支的最新版本。如需使用特定版本,可通过MOODLE_VERSION构建参数指定。
要使用特定版本,编辑docker compose.yml中moodle服务的build部分:
yamlmoodle: image: erseco/alpine-moodle build: context: . args: MOODLE_VERSION: v4.5.3 # 替换为所需版本
可用版本标签列表见:https://github.com/moodle/moodle/tags
Moodle在管理员 > 开发 > 创建测试场景下提供测试场景生成工具。要启用它,运行以下命令或添加到POST_CONFIGURE_COMMANDS:
bashphp admin/tool/generator/cli/runtestscenario.php
此工具允许使用.feature文件语法生成手动测试所需的所有元素。
安装额外Alpine包(以root用户):
bashdocker compose exec --user root moodle sh -c "apk update && apk add nano"
手动数据库升级:
bashdocker compose exec moodle php admin/cli/upgrade.php
访问日志:
bashdocker compose logs -f moodle
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。


探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务