Python 使用docker compose时调试链接的docker容器

Python 使用docker compose时调试链接的docker容器,python,docker,docker-compose,Python,Docker,Docker Compose,假设我有以下docker compose.yml文件并行运行两个不同的python应用程序(例如通过flask): app2链接到app1,因为我想从其中的app1获取特定数据。现在我的问题是我想调试这个链接的某个场景。我可以轻松地调试app1和app2作为独立容器(通过docker compose run--service ports…python app.py并将pdb放在代码中的某个位置)。我的问题是,如果请求来自app2,我想调试app1。如果使用docker compose run启动

假设我有以下
docker compose.yml
文件并行运行两个不同的python应用程序(例如通过flask):

app2
链接到
app1
,因为我想从其中的
app1
获取特定数据。现在我的问题是我想调试这个链接的某个场景。我可以轻松地调试
app1
app2
作为独立容器(通过
docker compose run--service ports…python app.py
并将
pdb
放在代码中的某个位置)。我的问题是,如果请求来自
app2
,我想调试
app1
。如果使用
docker compose run
启动
app1
,则
app2
无法解析链接。随着越来越多的应用程序/服务依靠链接相互“交谈”,这个问题变得更加严重


有什么好办法处理这个问题吗?通常,如何处理链接容器的调试问题(不一定是python指定的)?感谢您的输入。

如果您在同一台机器上进行本地开发,那么您可以在配置中添加一个
net:“主机”
,它可以执行以下操作:

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

有关更多信息,请参阅

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

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

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

如果您在服务端口打开的情况下启动
app2
服务,它不起作用吗?像
docker compose run——服务端口app2
。如果没有,您可以使用服务端口启动
app1
服务,获取其容器名称,然后启动第二个服务
app2
,手动将其链接到正在运行的
app1
(使用
--link
)。或者您甚至不需要提供链接,如果
app1
已经在运行(带有服务端口),并且它是此服务运行的唯一实例,则启动
app2
应自动连接到它。如果我使用
--service ports
标志启动两个服务,
app1
可以启动,但是
app2
无法启动,因为它试图分别启动
app1
的链接容器。如果我使用
--no deps
,则不会建立链接。您的第二个解决方案可以工作,但很难实现自动化。此外,我希望留在
docker compose
范围内,如果没有必要,也不要使用普通
docker
。我找到了一个目前适合我的解决方法。启动每个容器进行调试时,我使用
--服务端口
--无deps
标志运行它们。为了让它们通信,我还需要将主机IP作为环境变量传入,并公开每个容器的端口。主机IP可以从每个docker容器自动访问,因此我可以向那里发出请求,而不是从链接向IP发出请求。我还需要像这样启动所有中间容器。不过,这只是一个解决办法。我希望有一个内置的解决方案。对类似问题的回答为我解决了这个问题:
app1:
  command: python app.py
  build: app1/
  net: 'host'

app2:
  command: python app.py
  build: app2/
  net: 'host'
docker-compose up -d app1
docker-compose run app2