【发布时间】:2023-03-09 18:45:01
【问题描述】:
假设我有以下 docker-compose.yml 文件并行运行两个不同的 python 应用程序(例如通过烧瓶):
app1:
command: python app.py
build: app1/
app2:
command: python app.py
build: app2/
links:
- app1
app2 链接到app1,因为我想从其中的app1 获取特定数据。现在我的问题是我想调试这个链接的某个场景。我可以轻松地将app1 和app2 作为独立容器进行调试(通过docker-compose run --service-ports ... python app.py 并将pdb 放置在代码中的某个位置)。我的问题是当我想调试app1 以防请求来自app2。如果我以docker-compose run 开头app1,则app2 无法解析链接。随着更多应用程序/服务根据它们的链接相互“交谈”,这个问题变得更加严重。
有没有好的方法来处理这个问题?一般而言,您如何处理链接容器的调试问题(不一定是 python 特定的)?感谢您的意见。
【问题讨论】:
-
如果在服务端口开启的情况下启动
app2服务是不是不行?喜欢docker-compose run --service-ports app2。如果没有,您可以使用服务端口启动app1服务,获取它的容器名称,然后启动第二个服务app2,手动将其链接到正在运行的app1(使用--link)。或者你甚至不需要提供链接,如果app1已经在运行(带有服务端口),并且它是该服务运行的唯一实例,从app2开始应该连接到它自动。 -
如果我用
--service-ports标志启动这两个服务,app1可以启动,但app2无法启动,因为它尝试单独启动app1的链接容器。如果我使用--no-deps,则链接未建立。您的第二个解决方案会起作用,但很难自动化。另外,我想留在docker-compose的范围内,如果没有必要,不要使用普通的docker。 -
我找到了一种目前对我有用的解决方法。在启动每个容器进行调试时,我使用
--service-ports和--no-deps标志运行它们。为了让它们进行通信,我还需要传入主机 IP 作为环境变量并公开每个容器的端口。主机 IP 可以从每个 docker 容器自动访问,因此我可以向那里发出请求,而不是从链接向 IP 发出请求。另外我需要像这样启动所有中间容器。不过,它只是一种解决方法。我宁愿有一个内置的解决方案。 -
这个对类似问题的回答为我解决了这个问题:stackoverflow.com/a/40449862/4311512
标签: python docker docker-compose