
如果你使用 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 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
!size!https://raw.githubusercontent.com/11notes/static/refs/heads/master/img/markdown/transparent5x2px.png!pulls!https://raw.githubusercontent.com/11notes/static/refs/heads/master/img/markdown/transparent5x2px.png%5B](https://github.com/11notes/docker-joplin/issues)!https://raw.githubusercontent.com/11notes/static/refs/heads/master/img/markdown/transparent5x2px.png!swiss_made
以更小、轻量且更安全的方式运行Joplin
https://github.com/laurent22/joplin%EF%BC%88%E7%94%B1https://github.com/laurent22%E5%88%9B%E5%BB%BA%EF%BC%89%E6%98%AF%E4%B8%80%E6%AC%BE%E5%85%8D%E8%B4%B9%E5%BC%80%E6%BA%90%E7%9A%84%E7%AC%94%E8%AE%B0%E5%92%8C%E5%BE%85%E5%8A%9E%E4%BA%8B%E9%A1%B9%E5%BA%94%E7%94%A8%EF%BC%8C%E5%8F%AF%E5%A4%84%E7%90%86%E5%A4%A7%E9%87%8F%E7%BB%84%E7%BB%87%E5%88%B0%E7%AC%94%E8%AE%B0%E6%9C%AC%E4%B8%AD%E7%9A%84%E7%AC%94%E8%AE%B0%E3%80%82%E7%AC%94%E8%AE%B0%E6%94%AF%E6%8C%81%E6%90%9C%E7%B4%A2%E3%80%81%E5%A4%8D%E5%88%B6%E3%80%81%E6%A0%87%E8%AE%B0%EF%BC%8C%E5%8F%AF%E7%9B%B4%E6%8E%A5%E5%9C%A8%E5%BA%94%E7%94%A8%E4%B8%AD%E6%88%96%E9%80%9A%E8%BF%87%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8%E4%BF%AE%E6%94%B9%EF%BC%8C%E9%87%87%E7%94%A8Markdown%E6%A0%BC%E5%BC%8F%E3%80%82
此镜像能做什么? 提供无root权限、轻量的Joplin(服务器端,非客户端)安装,直接从源码编译,并包含多项自定义优化。
为何选择此镜像而非其他现有镜像? 因为:
若您重视安全性、简洁性和极致优化,此镜像可能适合您。
以下是此镜像与最常用或官方镜像的对比:
| 镜像 | 磁盘大小 | 默认用户 | https://github.com/11notes/RTFM/blob/main/linux/container/image/distroless.md | 支持架构 |
|---|---|---|---|---|
| 11notes/joplin | 2GB | 1000:1000 | ❌ | amd64, arm64 |
| joplin/server | 2GB | 1001:1001 | ❌ | amd64, arm64 |
为何此镜像非distroless? 因为应用开发者需动态加载Node模块,这仅在启用动态加载的情况下可行,而动态加载仅支持动态链接的二进制文件。
yamlname: "joplin" x-lockdown: &lockdown # 防止对镜像本身的写访问 read_only: true # 防止容器内进程获取更多权限 security_opt: - "no-new-privileges=true" services: server: depends_on: postgres: condition: "service_healthy" restart: true image: "11notes/joplin:3.6.14" <<: *lockdown environment: TZ: "Europe/Zurich" APP_BASE_URL: "https://${FQDN}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" SAML_ENABLED: true DISABLE_BUILTIN_LOGIN_FLOW: true SAML_IDP_XML: |- <md:EntityDescriptor entityID="https://${SSO_FQDN}/realms/${SSO_REALM}"> <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo> <ds:KeyName>${SSO_CRT_NAME}</ds:KeyName> <ds:X509Data> <ds:X509Certificate>${SSO_CRT_BASE64}</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml/resolve" index="0"/> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat> <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://${SSO_FQDN}/realms/${SSO_REALM}/protocol/saml"/> </md:IDPSSODescriptor> </md:EntityDescriptor> SAML_SP_XML: |- <?xml version="1.0"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" validUntil="2026-12-31T23:59:59Z" cacheDuration="PT604800S" entityID="${SSO_CLIENT_ID}"> <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://${FQDN}/api/saml" index="0" /> </md:SPSSODescriptor> </md:EntityDescriptor> volumes: - "server.etc:/joplin/etc" - "server.var:/joplin/var" tmpfs: - "/tmp:uid=1000,gid=1000" ports: - "3000:22300/tcp" networks: frontend: backend: restart: "always" postgres: # 有关此镜像的更多信息,请查看: # https://github.com/11notes/docker-postgres image: "11notes/postgres:18" <<: *lockdown environment: TZ: "Europe/Zurich" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" POSTGRES_BACKUP_SCHEDULE: "0 3 * * *" networks: backend: volumes: - "postgres.etc:/postgres/etc" - "postgres.var:/postgres/var" - "postgres.backup:/postgres/backup" tmpfs: - "/postgres/run:uid=1000,gid=1000" - "/postgres/log:uid=1000,gid=1000" restart: "always" volumes: server.etc: server.var: postgres.etc: postgres.var: postgres.backup: networks: frontend: backend: internal: true
要了解如何更改此容器镜像的默认UID/GID,请参考https://github.com/11notes/RTFM/blob/main/linux/container/image/11notes/how-to.changeUIDGID.md#change-uidgid-the-correct-way%E3%80%82
上述Compose示例使用SAML进行身份验证并禁用常规身份验证。使用SAML时,需在IdP中设置以下重要属性:
对于Keycloak,只需创建所需的用户属性映射器;其他IdP请参考其手册。
| 参数 | 值 | 描述 |
|---|---|---|
user | docker | 用户名 |
uid | 1000 | 用户标识符 |
gid | 1000 | 组标识符 |
home | /joplin | docker用户的主目录 |
| 参数 | 说明 | 默认值 |
|---|---|---|
TZ | 时区 | |
DEBUG | 启用容器镜像和应用的调试选项(如支持) | |
APP_BASE_URL | 应用的FQDN | |
MAX_TIME_DRIFT | 启用或禁用NTP时间漂移检查 | 0 |
DB_CLIENT | 数据库后端类型 | pg |
POSTGRES_HOST | PostgreSQL主机名 | postgres |
POSTGRES_DATABASE | PostgreSQL数据库名 | postgres |
POSTGRES_USER | PostgreSQL用户名 | postgres |
POSTGRES_PASSWORD | PostgreSQL用户密码 | |
STORAGE_DRIVER | 存储驱动类型 | Type=Filesystem;Path=/joplin/var |
SAML_ENABLED | 启用SAML | |
DISABLE_BUILTIN_LOGIN_FLOW | 启用SAML时禁用常规登录 | |
SAML_IDP_CONFIG_FILE | SAML IDP XML文件(可通过SAML_IDP_XML内联设置) | /joplin/etc/idp.xml |
SAML_SP_CONFIG_FILE | SAML SP XML文件(可通过SAML_SP_XML内联设置) | /joplin/etc/sp.xml |
SAML_IDP_XML | SAML IDP内联XML | |
SAML_SP_XML | SAML SP内联XML |
以下是镜像的主要标签。另有每个提交及其简写sha256值对应的标签。
个人认为:latest标签是不良习惯,不应使用。许多开发者在新版本中引入破坏性变更,会影响使用:latest的用户。若不想手动更新标签至最新语义化版本,可使用语义化版本的短版本:例如使用:3或:3.6而非:3.6.14。这些标签会随新版本更新,效果类似:latest但固定在主版本或次版本,理论上不会引入破坏性变更。
若坚持使用最新版本,可使用:rolling标签,但需注意:将即时获取应用的最新版本,无论是否存在破坏性变更或安全问题,风险自负!
docker pull 11notes/joplin:3.6.14 docker pull ghcr.io/11notes/joplin:3.6.14 docker pull quay.io/11notes/joplin:3.6.14
此镜像默认支持Unraid。只需在任何标签后添加**-unraid**,镜像将以99:100而非1000:1000运行。
此镜像默认支持nobody用户。只需在任何标签后添加**-nobody**,镜像将以65534:65534而非1000:1000运行。
此镜像仅供参考,风险自负。更新镜像版本前请务必备份。查看https://github.com/11notes/docker-joplin/releases%E4%BA%86%E8%A7%A3%E7%A0%B4%E5%9D%8F%E6%80%A7%E5%8F%98%E6%9B%B4%E3%80%82%E4%BD%BF%E7%94%A8%E4%B8%AD%E9%81%87%E5%88%B0%E9%97%AE%E9%A2%98%E8%AF%B7%E6%8F%90%E4%BA%A4https://github.com/11notes/docker-joplin/issues%EF%BC%9B%E6%9C%89%E9%97%AE%E9%A2%98%E6%88%96%E5%BB%BA%E8%AE%AE%E8%AF%B7%E5%88%9B%E5%BB%BAhttps://github.com/11notes/docker-joplin/discussions%E8%80%8C%E9%9D%9Eissue%E3%80%82%E6%89%80%E6%9C%89%E4%BB%93%E5%BA%93%E5%8F%AF%E5%9C%A8https://github.com/11notes?tab=repositories%E6%9F%A5%E7%9C%8B%E3%80%82
创建于20.05.2026, 10:39:44 (CET)
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务