You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dokku链接容器报错,如何正确关联指定运行容器?

解决Dokku跨容器进程访问的容器链接问题

你尝试通过以下命令配置容器链接,让service.prepareworker.1访问service.unoserver.1:

dokku docker-options:add service deploy,build,run --link service.unoserver.1:unoserver_host
dokku ps:restart service

但重启后触发错误:

Error response from daemon: Cannot link to a non running container: /service.unoserver.1.1695992273 AS /sevice.prepareworker.1/unoserver_host

当前运行容器列表:

CONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS         PORTS      NAMES
f47bb2ec5626   dokku/service:latest   "unoserver --interfa…"   6 minutes ago   Up 6 minutes   5000/tcp   service.unoserver.1
d35c1a242d52   dokku/service:latest   "python manage.py ru…"   6 minutes ago   Up 6 minutes   5000/tcp   service.prepareworker.1

问题原因

Dokku在重启或重新部署应用时,会自动为容器追加时间戳后缀(比如.1695992273)生成临时容器名,你硬编码的固定容器名service.unoserver.1会因为容器实际名称变化而失效,导致Docker无法找到对应容器完成链接。

解决方案

方法1:利用Dokku应用内部网络(推荐)

Dokku默认会为每个应用创建专属内部Docker网络,同一应用下的所有进程容器都在该网络内,直接通过进程名称即可访问对方服务。

比如你的unoserver进程名称是unoserver,在prepareworker进程中直接用unoserver作为主机名就能访问对应服务,无需额外配置链接。

验证方式:

# 进入prepareworker容器
dokku enter service prepareworker.1
# 测试连通性
ping unoserver

方法2:通过环境变量传递服务地址

给应用设置环境变量,统一指定unoserver的访问地址,代码中读取该变量即可:

dokku config:set service UNOSERVER_HOST=unoserver

方法3:依赖Procfile自动进程映射(多进程应用场景)

如果你的应用是通过Procfile定义的多进程(比如unoserver和prepareworker都是Procfile中声明的进程),Dokku会自动在容器hosts文件中添加进程名称的映射,两个进程容器默认即可互相访问。

示例Procfile内容:

unoserver: unoserver --interface 0.0.0.0
prepareworker: python manage.py runworker

方法4:动态前缀链接(不推荐)

若一定要使用--link参数,避免硬编码完整容器名,改用容器名称前缀(但该方式依赖Dokku命名规则,稳定性不如前三种):

dokku docker-options:add service deploy,build,run --link service.unoserver:unoserver_host

内容的提问来源于stack exchange,提问作者Rhenan Bartels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:23:33