Eggdrop 1.10.2 Docker Compose 部署指南
使用 Docker Compose 部署 Eggdrop 1.10.2:官方 eggdrop 镜像选型(含废弃 eggheads/eggdrop 辨识)、环境变量、数据持久化与运维命令全实测。
Eggdrop 1.10.2 Docker Compose 部署指南
目标:用 Docker Compose 一键部署 Eggdrop 1.10.2 IRC 机器人,完成 owner 创建、partyline 登录与数据持久化。全文已在 Docker 29.9.2 + Compose v5.6.1 环境实测通过。
一、环境信息
- 容器运行时:Docker 29.9.2,Docker Compose v5.6.1
- 镜像:
eggdrop:1.10.2(Docker 官方镜像,2026-10-21 更新,amd64/arm/arm64 多架构,镜像体积 44.2MB) - 机器人昵称:eggcomposebot;partyline 管理端口:3333(映射到宿主机同端口)
- 数据目录:
./data→ 容器内/home/eggdrop/eggdrop/data(userfile/chanfile/配置均落这里) - IRC 服务器:示例使用自建 ngIRCd(
10.89.75.2 6667),替换为你的 IRC 网络地址即可
二、镜像选型说明
Eggdrop 在 Docker Hub 上有两个命名空间,务必区分(查询日期 2026-10-25):
| 镜像 | 性质 | 最新标签 | 最近更新 | 结论 |
|---|---|---|---|---|
eggdrop(即 library/eggdrop) | Docker Official Images 官方镜像 | 1.10.2 / 1.10 / stable / latest | 2026-10-21 | 本文采用 |
eggheads/eggdrop | Eggheads 组织早期上传的旧镜像 | 1.8.0(2016) | 2016-07-30 | 已废弃,勿用 |
官方镜像维护仓库为 github.com/eggheads/eggdrop-docker,README 明确指向 Docker Hub 官方镜像页 hub.docker.com/_/eggdrop。镜像内运行时为 Tcl 9.0.3 + OpenSSL 3.5.9(实测 .status 回显),比 Ubuntu 22.04 自带 Tcl 8.6 更新。
镜像关键约定(docker inspect eggdrop:1.10.2 实测):
Entrypoint: [/home/eggdrop/eggdrop/entrypoint.sh] | Cmd: [eggdrop.conf]
WorkDir: /home/eggdrop/eggdrop | ExposedPorts: {"3333/tcp":{}} | User:(启动后由 su-exec 降为 eggdrop)
Env: NICK= SERVER= LISTEN=3333 USERFILE=eggdrop.user CHANFILE=eggdrop.chan
三、前置条件
- 已安装 Docker(≥ 20.10)与 Docker Compose 插件。
- 一个可连接的 IRC 服务器地址(公共网络如 Libera.Chat,或自建 ngIRCd;自建方法见《Ubuntu 22.04 安装 Eggdrop 1.10.2 指南》八、章的 ngIRCd 节)。
- 确认宿主机 3333 端口空闲:
ss -ltn | grep 3333无输出。
四、部署步骤
4.1 准备目录与 compose 文件
mkdir -p /opt/eggdrop-stack/data
cd /opt/eggdrop-stack
创建 docker-compose.yml(实测可用的完整版):
name: eggdrop-1.10.2-stack
services:
eggdrop:
image: eggdrop:1.10.2
container_name: eggdrop-1.10.2-bot
restart: unless-stopped
tty: true # 必需:entrypoint 以 -t 终端模式启动,无 TTY 会立即退出
stdin_open: true
environment:
NICK: eggcomposebot # 机器人 IRC 昵称
SERVER: 10.89.75.2 6667 # IRC 服务器与端口(换成你的网络)
EGGOWNER: admin # 首次启动自动创建的 owner 账号
EGGOWNER_PASS: q1w2e3r4 # owner 密码(设了 EGGOWNER 就必须设置)
LISTEN: "3333" # partyline telnet 监听端口
ports:
- "3333:3333"
volumes:
- ./data:/home/eggdrop/eggdrop/data
逐项说明:
tty: true+stdin_open: true:不可省略。entrypoint 固定以./eggdrop -t -m eggdrop.conf(终端模式)启动,无 TTY 时机器人读到END OF FILE ON TERMINAL立即退出,容器陷入重启循环(实测复现,见十、常见问题 Q1)。EGGOWNER/EGGOWNER_PASS必须成对设置:只设EGGOWNER会报* ERROR: Owner handle specified, but password environment variable missing. Quitting. Set EGGOWNER_PASS to fix(实测复现)。volumes不挂时容器会打印醒目警告「You did not specify a location on the host machine to store your data... you will likely LOSE YOUR DATA!」,且 userlist/chanlist 全部随容器删除丢失。
4.2 启动与验证
docker compose config # 先校验渲染结果
docker compose up -d
sleep 10
docker compose ps
实测 docker compose ps:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
eggdrop-1.10.2-bot eggdrop:1.10.2 "/home/eggdrop/eggdr…" eggdrop 1 minute ago Up 1 minute 0.0.0.0:3333->3333/tcp, [::]:3333->3333/tcp
查看启动日志确认已连上 IRC:
docker compose logs --tail=10 eggdrop
实测回显(节选):
eggdrop-1.10.2-bot | --- Loading eggdrop v1.10.2
eggdrop-1.10.2-bot | Listening for telnet connections on 0.0.0.0 port 3333 (all).
eggdrop-1.10.2-bot | Module loaded: pbkdf2
...(其余模块加载行略,输出节选)
eggdrop-1.10.2-bot | [05:23:59] Trying server 10.89.75.2:6667
eggdrop-1.10.2-bot | [05:23:59] Connected to 10.89.75.2
4.3 登录 partyline 验证
设了 EGGOWNER/EGGOWNER_PASS 后,owner 账号已在首次启动时自动创建,无需再走 -m 模式的 NEW 注册流程,直接 telnet 登录:
telnet 127.0.0.1 3333
# 提示 Please enter your handle. 时输入 admin,再输入密码 q1w2e3r4
登录成功后执行 .status(实测回显节选):
I am eggcomposebot, running eggdrop v1.10.2: 2 users (mem: 88k).
Online for 00:01 (terminal mode) - CPU: 00:00.05 - Cache hit: 57.1%
Config file: eggdrop.conf
Tcl version: 9.0.3 (header version 9.0.3)
TLS library: OpenSSL 3.5.9 29 Sep 2026
IPv6 support is enabled.
Threaded DNS core is enabled.
💡 说明:显示「2 users」是因为镜像内 docker.tcl 自动建了一个控制台用户
-HQ;(terminal mode)字样来自-t启动方式,属正常。
五、数据持久化说明
宿主 ./data 目录挂载到容器 /home/eggdrop/eggdrop/data,entrypoint 会把生成的配置、userfile、chanfile 全部放这里并做符号链接。实测落盘内容:
ls -la data/
-rw------- 1 3333 root 81 Oct 25 05:23 eggdrop.chan
-rw-r--r-- 1 3333 nogroup 67584 Oct 25 05:22 eggdrop.conf
⚠️ 注意:data 目录内文件属主为容器内 eggdrop 用户(uid 3333)。宿主机直接编辑
data/eggdrop.conf不受限制,但新增文件注意别让容器内进程因属主/权限读不到(保持 0644/属主 3333 即可)。后续修改配置:直接编辑宿主
data/eggdrop.conf,然后docker compose restart(或登录 partyline 执行.rehash热加载)。首次启动后,NICK/SERVER等环境变量不再生效——以data/eggdrop.conf内容为准。
六、环境变量表
官方镜像 entrypoint 支持的全部环境变量(按镜像 Env 与 entrypoint 实测整理):
| 变量 | 必填 | 默认值 | 作用 |
|---|---|---|---|
NICK | 首次启动必填 | 无 | 机器人 IRC 昵称 |
SERVER | 首次启动必填 | 无 | IRC 服务器地址,格式 主机 [端口] [密码],TLS 端口加 + 前缀如 irc.libera.chat +6697 |
LISTEN | 否 | 3333 | partyline telnet 监听端口 |
USERFILE | 否 | eggdrop.user | 用户库文件名(存于 data 目录) |
CHANFILE | 否 | eggdrop.chan | 频道动态数据文件名 |
EGGOWNER | 否 | 无 | 首次启动自动创建的 owner 用户名;设置后必须同时设 EGGOWNER_PASS |
EGGOWNER_PASS | 与 EGGOWNER 成对 | 无 | owner 密码 |
不设 EGGOWNER 时,首次启动进入传统 -m 用户库创建模式:telnet 输入 NEW 注册首个 owner(流程见《Ubuntu 22.04 安装 Eggdrop 1.10.2 指南》5.8 节)。
七、配置参数说明
容器内生成的 data/eggdrop.conf 与源码包内置的全量示例配置一致(约 1700 行、30 个配置域),仅由 entrypoint 用环境变量替换了 nick/server/listen/owner/userfile/chanfile 等关键行。完整参数逐项说明见《Eggdrop 1.10.2 配置参数详解》。
八、配置文件挂载
推荐方式就是五、章的整目录挂载(./data:/home/eggdrop/eggdrop/data),配置、用户库、频道库一个目录全管。若只想挂载单个配置文件,也可以:
volumes:
- ./data/eggdrop.conf:/home/eggdrop/eggdrop/data/eggdrop.conf
⚠️ 注意:单文件挂载下 userfile/chanfile 仍在容器可写层,删容器即丢,仅适合纯调试;正式使用请用整目录挂载。
九、等价 docker run
不使用 Compose 时的等价命令:
docker run -d --name eggdrop-1.10.2-bot --restart unless-stopped \
-it \
-e NICK=eggcomposebot \
-e "SERVER=10.89.75.2 6667" \
-e EGGOWNER=admin \
-e EGGOWNER_PASS=q1w2e3r4 \
-e LISTEN=3333 \
-p 3333:3333 \
-v /opt/eggdrop-stack/data:/home/eggdrop/eggdrop/data \
eggdrop:1.10.2
-it 对应 compose 里的 tty: true + stdin_open: true,同样不可省略。
十、常用运维命令
docker compose ps # 查看运行状态与端口映射
docker compose logs -f eggdrop # 跟踪日志
docker compose restart # 修改 data/eggdrop.conf 后重启生效
docker compose down # 停止并删除容器(数据保留在 ./data)
docker compose up -d # 再启动(沿用已持久化的配置与用户库)
docker exec -it eggdrop-1.10.2-bot sh # 进容器排障
十一、常见问题
Q1:容器一直 Restarting,日志末尾是 * END OF FILE ON TERMINAL?
entrypoint 以 -t(终端模式)启动 eggdrop,compose 没分配 TTY 导致读到 EOF 退出。在 compose 中加 tty: true 和 stdin_open: true 后 docker compose up -d 重建即可(实测由 Restarting 恢复为稳定 Up)。
Q2:日志报 * ERROR: Owner handle specified, but password environment variable missing. Quitting. Set EGGOWNER_PASS to fix?
只设置了 EGGOWNER 没设 EGGOWNER_PASS,补上后者即可(实测复现与修复)。
Q3:日志反复提示 You did not specify a location on the host machine to store your data... LOSE YOUR DATA?
没挂数据卷,加上 volumes: - ./data:/home/eggdrop/eggdrop/data 重建。
Q4:改了环境变量(NICK/SERVER)重启后不生效?
这些变量只在 data/ 下还没有配置文件时的首次启动生效;之后以 data/eggdrop.conf 为准。要么改 data/eggdrop.conf 后 docker compose restart,要么停栈后删除 data 内文件重来(会丢用户库)。
Q5:telnet 登录后 .tcl 命令提示 What? You need '.help'?
镜像 entrypoint 会把 EGGOWNER 写进配置的 set owner,因此用 EGGOWNER 创建的账号就是永久 owner,.tcl 默认可用;若你自己把 data/eggdrop.conf 里的 set owner 行改丢了,恢复该行后 .rehash 即可。机制详解见《Eggdrop 1.10.2 配置参数详解》must-be-owner 节。
Q6:想用 TLS 连接 IRC 网络?
SERVER 值用 +端口 前缀,如 irc.libera.chat +6697;镜像已带 OpenSSL 3.5.9,TLS 支持开箱即用(.status 实测可见 TLS support is enabled)。
十二、参考链接
- Docker Hub 官方镜像页:https://hub.docker.com/_/eggdrop/
- 官方镜像维护仓库(entrypoint/Dockerfile 源码):https://github.com/eggheads/eggdrop-docker
- Eggdrop v1.10.2 Release Notes:https://github.com/eggheads/eggdrop/releases/tag/v1.10.2
- Eggheads 官方文档站:https://docs.eggheads.org/