Eggdrop 1.10.2 Docker Compose 部署指南

使用 Docker Compose 部署 Eggdrop 1.10.2:官方 eggdrop 镜像选型(含废弃 eggheads/eggdrop 辨识)、环境变量、数据持久化与运维命令全实测。

EggdropEggdropIRC即时通信2026/10/25

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 / latest2026-10-21本文采用
eggheads/eggdropEggheads 组织早期上传的旧镜像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否3333partyline 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)。

十二、参考链接