【问题标题】:Debugging linked docker containers when using docker-compose使用 docker-compose 时调试链接的 docker 容器
【发布时间】: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


【解决方案1】:

如果您在同一台机器上进行本地开发,那么您可以将net: 'host' 添加到您的配置中,执行以下操作:

告诉 Docker 跳过将容器放置在单独的网络堆栈中。本质上,这个选择告诉 Docker 不要容器化容器的网络!

欲了解更多信息,请参阅the documentation

app1:
  command: python app.py
  build: app1/
  net: 'host'

app2:
  command: python app.py
  build: app2/
  net: 'host'

此外,出于调试目的,您应该在守护程序模式下启动 app1,在前台模式下启动 app2:

docker-compose up -d app1
docker-compose run app2

一旦您收到从 app1 到 app2 的请求,您就会下拉到 app2 中的 (pdb)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2017-09-02
    • 1970-01-01
    • 2015-09-11
    • 2020-09-24
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多