360 Secure SkillHub
360 安全技能中心
当前公开展示的是 Unraid XML Generator。本作品已批准的版本仍可按原地址安装和更新。

Unraid Xml Generator

该 Skill 依据结构化参数生成 Unraid DockerMan 用户模板 XML,涵盖仓库、网络、端口、路径、环境变量等字段,并可用 ExtraParams 与 PostArgs 覆盖镜像 ENTRYPOINT;可选把生成的 XML 写入 Unraid 模板目录,写入前需用户确认。

ashanzzz
ashanzzz
热度 16.72
最近更新 2026-04-02 21:31:52
分类:开发依赖:代码执行 / 读写文件应用场景:模板 / DevOps / 自动化脚本

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add ashanzzz-unraid-xml-generator
Metadata
name
unraid-xml-generator
description
Generate Unraid DockerMan user template XML files from structured input. Use when: the user asks to "生成 Unraid XML 模板", "创建 Docker 模板", "为 XXX 写 Unraid 模板", or "生成 DockerMan XML" for any container. Key technique learned (2026-04-02): Unraid DockerMan templates support <ExtraParams>--entrypoint /bin/sh</ExtraParams> + <PostArgs> to bypass the container image's ENTRYPOINT. This allows overriding any image's startup command from the template. Config variables use: <Config Name="..." Target="ENV_VAR" Default="..." Type="..." Display="..." Required="..." Mask="..."> These become environment variables passed into the container. The skill generates a complete, valid XML and optionally deploys it to /boot/config/plugins/dockerMan/templates-user/my-<name>.xml (requires user confirmation before writing).

Unraid XML Generator

Core Pattern

The key insight for Unraid Docker templates:

<Container version="2">
  <Name>mycontainer</Name>
  <Repository>image:tag</Repository>
  <Network>bridge</Network>

  <!-- KEY: override ENTRYPOINT to /bin/sh -->
  <ExtraParams>--entrypoint /bin/sh</ExtraParams>

  <!-- KEY: pass real startup command through shell -ec -->
  <PostArgs>-ec 'real startup command here'</PostArgs>

  <!-- User-configurable variables -->
  <Config Name="Display Name" Target="ENV_VAR" Default="..." Type="Variable" Display="always" Required="false" Mask="true">default_value</Config>
  <Config Name="Port" Target="PORT" Default="8080" Mode="tcp" Type="Port" Display="always" Required="true">8080</Config>
  <Config Name="Data Path" Target="/data" Default="/mnt/user/appdata/mycontainer" Mode="rw" Type="Path" Display="always" Required="true">/mnt/user/appdata/mycontainer</Config>
</Container>

Template Field Reference

Field Purpose
<Name> Unique container identifier
<Repository> Docker image with tag
<Registry> Registry URL (optional, informational)
<Network> Network mode: bridge, host, none
<Shell> Default shell (bash / sh)
<ExtraParams> Extra docker run flags (e.g. --entrypoint /bin/sh)
<PostArgs> Startup command passed to shell -ec
<WebUI> Format: http://[IP]:[PORT:nnnn]/ — shows button in Unraid UI
<Icon> URL to icon image
<Category> Unraid category string
<Config> User-configurable parameter

Config Types

Type Example
Variable Environment variable (Target = env var name)
Port Port mapping (Mode="tcp"/"udp")
Path Volume path (Mode="rw"/"ro")
Slider Numeric slider (requires Min, Max, Step)
Description Read-only description text

Config Display Options

Display value When shown
always Always visible in UI
advanced Hidden behind "Advanced" toggle
hidden Never shown (manual config)

Masked Variables (secrets)

Set Mask="true" on Type="Variable" Config entries to:

  • Hide the value from the UI (shown as ••••••)
  • Treat as sensitive (API keys, tokens, passwords)

PostArgs Shell Pattern

# Correct way to write PostArgs in XML:
<PostArgs>-ec 'export VAR1="value1" && export VAR2="value2" && exec real_command --flag arg'</PostArgs>

# Breaking down:
# -e  : exit on error
# -c  : read command from string (not stdin)
# '...' : single-quoted command string

Standard Config Variables to Include

For any container:

<Config Name="HTTP Proxy" Target="HTTP_PROXY" Default="" Type="Variable" Display="advanced" Required="false" Mask="false">http://192.168.8.30:7893</Config>
<Config Name="HTTPS Proxy" Target="HTTPS_PROXY" Default="" Type="Variable" Display="advanced" Required="false" Mask="false">http://192.168.8.30:7893</Config>
<Config Name="NO Proxy" Target="NO_PROXY" Default="" Type="Variable" Display="advanced" Required="false" Mask="false">localhost,127.0.0.1,192.168.0.0/16</Config>
<Config Name="TZ" Target="TZ" Default="Asia/Shanghai" Type="Variable" Display="advanced" Required="false" Mask="false">Asia/Shanghai</Config>

Script Usage

python3 scripts/generate_template.py \
  --name opencode \
  --image ghcr.io/anomalyco/opencode:latest \
  --port 4096 \
  --web-port 4097 \
  --output /tmp/opencode.xml

# Generate with all standard env vars:
python3 scripts/generate_template.py \
  --name opencode \
  --image ghcr.io/anomalyco/opencode:latest \
  --port 4096 \
  --web-port 4097 \
  --proxy 192.168.8.30:7893 \
  --tz Asia/Shanghai \
  --output /tmp/opencode.xml

Common Pitfalls

  1. Double quotes in PostArgs → escape as &quot; in XML
  2. ENTRYPOINT bypass → always use <ExtraParams>--entrypoint /bin/sh</ExtraParams>
  3. Shell variable substitution → use single quotes for PostArgs to prevent $VAR expansion by XML parser
  4. Template filename → must start with my- and end with .xml
  5. Path permissions → Unraid runs containers as PUID/PGID = 99/100 by default

Output

The generated XML file is placed at:

/boot/config/plugins/dockerMan/templates-user/my-<name>.xml

User must confirm before deploying (writing) to that path.