使用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
相关产品推荐
相关产品推荐

