
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
service-base是基于“每个容器一个服务”原则的Docker基础镜像,通过https://github.com/just-containers/s6-overlay%E9%9B%86%E6%88%90%E4%BA%86https://skarnet.org/software/s6-linux-init/%E3%80%82%E8%AF%A5%E9%95%9C%E5%83%8F%E9%87%87%E7%94%A8%E5%88%86%E5%B1%82%E6%9E%84%E5%BB%BA%E7%BB%93%E6%9E%84%EF%BC%8C%E5%8C%85%E5%90%AB%E6%BB%A1%E8%B6%B3%E4%B8%8D%E5%90%8C%E9%9C%80%E6%B1%82%E7%9A%84%E8%84%9A%E6%9C%AC%EF%BC%8C%E6%97%A8%E5%9C%A8%E4%B8%BA%E6%9E%84%E5%BB%BAWeb%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%B9%E5%99%A8%E6%8F%90%E4%BE%9B%E7%AE%80%E5%8D%95%E6%98%93%E7%94%A8%E7%9A%84%E5%9F%BA%E7%A1%80%E3%80%82
/etc/cont-init.d:包含初始化时按顺序运行的脚本(在主命令前执行),不同层会在此添加脚本,详情见S6覆盖层文档/etc/services.d/:存放S6服务的目录(由S6覆盖层复制到/run/service/)/data:应用容器的共享数据卷/local:指向/data/$CONTAINER_TYPE的链接(由/etc/cont-init.d/00_local_data创建)/src:此目录下的所有文件会被复制到/srv/(由/etc/cont-init.d/10_copy_srcs执行)base层(基础层)
仅包含S6初始化系统和基础工具:
apt_install、apt_purge工具及apt配置,简化层和应用容器的构建:
apt_install [packages...]:更新索引、安装指定包、移除deb包和索引apt_purge [packages...]:彻底移除指定包及其残留文件/usr/local/lib/prefix-logs:可用于在日志输出到stdout前添加服务名前缀,使用时需将服务的./log/run链接到此脚本/usr/local/lib/cont-init-functions.sh:包含帮助创建简单cont-init.d脚本的Shell函数,详见文件内容及示例run_services <service> [service...]和start_services <service> [service...]:用于运行一次性服务或启动带重启策略的服务,均为https://skarnet.org/software/s6/s6-svc.html%E7%9A%84%E5%B0%81%E8%A3%85%E5%B7%A5%E5%85%B7dbipc层(基于base层)
添加PostgreSQL和RabbitMQ支持:
create-db.sh <user> <database_name> [<command> [args...]]:
启动PostgreSQL,创建用户和数据库,运行命令初始化数据库,最后将内容 dump 到/srv/db-$database_name.sql.gz。用于在Dockerfile中预构建复杂数据库,加快容器首次启动速度。
init-db.sh <user> <database_name> [<command> [args...]]:
检查用户是否能连接到database_name数据库。若无法连接,创建数据库和用户,若/srv/db-$database_name.sql.gz存在则用其填充数据库,否则执行指定命令;若可连接,则运行命令更新数据库。首次创建时会设置环境变量DATABASE_IS_EMPTY=true。
两个命令均会设置以下环境变量并以user身份运行命令:
DATABASE_USER=$user、DATABASE_NAME=$database_name、DATABASE_IS_EMPTY=[true|]、USER=$user
python3层(基于dbipc层)
Python项目基础层:
pip_install:Dockerfile中使用的pip安装工具,为pip3 install --no-cache-dir --disable-pip-version-check的别名/etc/cont-init.d/90_virtualenv:为/srv/<app>/requirements.txt创建位于/local下的虚拟环境。例如,将开发代码挂载到/srv/myapp时,会创建/local/venv_myapp并安装项目依赖django层(基于python3层)
Django项目专用工具:
django-migrate.sh [bootstrap]:配合create-db.sh和init-db.sh使用的工具。若存在requirements.txt,会执行./manage.py makemigrations并输出创建的迁移文件(用于识别缺失迁移);然后运行./manage.py migrate更新数据库;若$DATABASE_IS_EMPTY为true且存在引导脚本,会用python3执行该脚本。引导脚本为django-migrate.sh的第一个参数或/srv/db-$DATABASE_NAME-bootstrap.py
run-django.sh [-u user] [-d database_name] [-a app_path] [-s setup_script] [-i init_script]:
参数默认值:user为$CONTAINER_TYPE,database_name为user,app_path为/srv/$user,setup_script为/srv/$app_name-setup.py,init_script为/srv/$app_name-init.sh(app_name为$app_path的目录名)。执行流程:
/local/venv_$app_name/bin/activate存在,则激活虚拟环境(见python3层的/etc/cont-init.d/90_virtualenv)init-db.sh $user $database_name django-migrate.sh确保数据库状态requirements.txt,运行./manage.py compilemessages./manage.py collectstatic$setup_script存在,以$user身份用python3执行$init_script存在,以root身份执行$user身份执行:
manage,执行./manage.py <其余参数>./manage.py help脚本遇到第一个失败时退出(set -x)
适用于构建需要单服务容器的本地测试环境,特别适合Web应用(尤其是Python/Django项目)的开发和测试容器构建,提供标准化的初始化流程和工具链,简化开发环境配置。
Dockerfile
DockerfileFROM docker.xuanyuan.run/apluslms/service-base:django-latest ENV CONTAINER_TYPE="myapp" \ DJANGO_LOCAL_SETTINGS="/srv/myapp-django-settings.py" \ DJANGO_SECRET_KEY_FILE="/local/django/secret_key.py" RUN adduser --system --no-create-home --disabled-password --gecos "A webapp server,,," --home /srv/myapp --ingroup nogroup myapp RUN mkdir /srv/myapp && chown myapp.nogroup /srv/myapp COPY myapp-cont-init.sh /etc/cont-init.d/myapp COPY myapp-django-settings.py \ myapp-init.sh \ db-myapp-bootstrap.py \ /srv/ COPY myapp /srv/myapp/ WORKDIR /srv/myapp/ RUN python3 -m compileall -q . RUN pip_install -r requirements.txt && rm requirements.txt RUN python3 manage.py compilemessages 2>&1 RUN create-db.sh myapp myapp django-migrate.sh EXPOSE 8000 CMD [ "manage", "runserver", "0.0.0.0:8000" ]
Django设置文件(myapp-django-settings.py)
pythonSTATIC_ROOT = '/local/myapp/static/' MEDIA_ROOT = '/local/myapp/media/' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'myapp' }} CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/run/myapp/django-cache' }}
容器初始化脚本(myapp-cont-init.sh)
shell#!/bin/sh . /usr/local/lib/cont-init-functions.sh ENSURE_DIR_MODE=2755 ENSURE_DIR_USER=myapp ENSURE_DIR_GROUP=nogroup ensure_dir /run/myapp ensure_dir /local/myapp ensure_dir /local/myapp/static ensure_dir /local/myapp/media
Django应用配置示例
Django应用可使用Django https://pypi.org/project/raphendyr-django-essentials/%E4%B8%AD%E7%9A%84%E6%9C%AC%E5%9C%B0%E8%AE%BE%E7%BD%AE%E5%92%8C%E5%AF%86%E9%92%A5%E5%87%BD%E6%95%B0%EF%BC%9A
pythonupdate_settings_with_file(__name__, environ.get('DJANGO_LOCAL_SETTINGS', 'local_settings'), quiet='DJANGO_LOCAL_SETTINGS' in environ) update_secret_from_file(__name__, environ.get('DJANGO_SECRET_KEY_FILE', 'secret_key'))
CONTAINER_TYPE:容器类型,用于定义/local路径指向(/data/$CONTAINER_TYPE)DATABASE_USER:数据库用户(由create-db.sh和init-db.sh设置)DATABASE_NAME:数据库名称(由create-db.sh和init-db.sh设置)DATABASE_IS_EMPTY:数据库是否首次创建(true表示首次创建,由init-db.sh设置)DJANGO_LOCAL_SETTINGS:Django本地设置文件路径DJANGO_SECRET_KEY_FILE:Django密钥文件路径您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务