Rider:通过SSH在WSL2上调试在docker容器中运行的远程应用程序

rqcrx0a6  于 2023-05-06  发布在  Docker
关注(0)|答案(1)|浏览(331)

Rider's documentation on how to debug remote applications via SSH,当我调试运行在WSL 2上的应用程序时,它可以完美地工作。但是它不能调试在WSL 2中的docker容器中运行的应用程序。Rider甚至在“运行”-〉“附加到远程进程”菜单中显示此应用程序,但无法附加到它(没有错误,但不附加)。
我可能需要在应用程序运行的docker容器中运行JetBrains SSH Server Utility并共享端口,但我不知道如何正确执行。

**编辑:**为了清楚起见,我添加了一个图表,说明我希望得到的结果。

任何帮助是非常感谢。谢谢

tsm1rwdh

tsm1rwdh1#

下面是在Docker容器中远程调试Rider的解决方案。确切的解决方案取决于您的特定环境以及您使用Docker构建的映像类型。步骤通常如下:
1.在Dockerfile中下载相应的JetBrains SSH代理
1.设置必要的权限来运行它(某些图像可能无法以root运行)
1.创建一个 Package 器entrypoint脚本,该脚本首先执行SSH代理,然后执行您的应用。
1.将此entrypoint设置为Dockerfile中的默认ENTRYPOINTCMD
1.运行映像,转发必要的调试器端口
从那里开始,步骤与任何其他远程SSH连接相同。
假设你有一个Dockerfileubuntu上构建你的应用:

Dockerfile

FROM ubuntu:18.04
WORKDIR /usr/local/app

# Copy required files including entrypoint wrapper
COPY entrypoint.sh /usr/local/bin/

RUN apt-get update && apt-get install -y curl
RUN \
   # replace with the appropriate arch as needed
   curl -L "https://download.jetbrains.com/rider/ssh-remote-debugging/linux-x64/jetbrains_debugger_agent_20230319.24.0" \
    -o /usr/local/bin/debugger && \
    chmod +x /usr/local/bin/debugger

# debugging port
EXPOSE 7777

# expose your actual application ports e.g.
# EXPOSE 80

ENTRYPOINT ["entrypoint.sh"]

entrypoint.sh

#!/usr/bin/env bash
/usr/local/bin/debugger -port 7777 &
# execute your actual application next
# e.g. `node index.js`
sleep 1d

接下来,构建包含启用调试符号的应用程序的映像:

$ docker build -t jetdebug .
[+] Building 13.2s (10/10) FINISHED                                                                                                                                                                                                      
 => [internal] load build definition from Dockerfile                                                                                                                                                                                0.0s
 => => transferring dockerfile: 532B                                                                                                                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                   0.0s
 => => transferring context: 2B                                                                                                                                                                                                     0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                                                                                     0.0s
 => [1/5] FROM docker.io/library/ubuntu:18.04                                                                                                                                                                                       0.0s
 => [internal] load build context                                                                                                                                                                                                   0.0s
 => => transferring context: 170B                                                                                                                                                                                                   0.0s
 => CACHED [2/5] WORKDIR /usr/local/app                                                                                                                                                                                             0.0s
 => [3/5] COPY entrypoint.sh /usr/local/bin/                                                                                                                                                                                        0.0s
 => [4/5] RUN apt-get update && apt-get install -y curl                                                                                                                                                                            10.7s
 => [5/5] RUN    curl -L "https://download.jetbrains.com/rider/ssh-remote-debugging/linux-x64/jetbrains_debugger_agent_20230319.24.0"     -o /usr/local/bin/debugger &&     chmod +x /usr/local/bin/debugger                        2.3s 
 => exporting to image                                                                                                                                                                                                              0.2s 
 => => exporting layers                                                                                                                                                                                                             0.2s 
 => => writing image sha256:b98a6356808dd97fe1222892914305fcf1f47e709ac68bde41077a8a24769563                                                                                                                                        0.0s 
 => => naming to docker.io/library/jetdebug

最后,启动容器:

$ docker run --rm -i -p7777:7777 jetdebug                                                                                                                                                                        
Using host key fingerprint SHA256:ietD1qIhLzcDNcmH/dm2kp6us1j8QRa4yErNhn7vAYo
Please use these credentials to establish SSH connection:

Login:  root
Password:  ajpOUbr7dNLIp1gy
Port:  7777

Copy the three lines above and switch to Rider: it will detect the credentials in the clipboard and suggest adding a new remote host configuration with these login, password, and port.
Note: you will still need to specify the host name manually.

请注意,-p7777:7777标志指定运行容器时的转发端口7777。如果在单独的服务器上执行此操作,则可能需要更改防火墙设置,以进一步允许远程访问端口。
我们现在可以看到,在主机上,端口7777被正确转发到调试SSH代理:

$ nc -v localhost 7777
Connection to localhost (127.0.0.1) 7777 port [tcp/*] succeeded!
SSH-2.0-Go
^C

从这里,您可以远程连接,如正常在骑士。
如果您的应用程序使用不同的基础Docker镜像,步骤是相同的,但可能需要根据所涉及的操作系统和架构进行调整。
entrypoint逻辑显然可以用任何语言编写。
还要注意,此设置包含几个反模式,不建议将其用于任何类型的生产部署。除了调试符号永远不应该出现在生产代码中之外,容器应该只包含一个关注点,并且调试SSH进程不会被docker进程监视,以防它意外崩溃。

相关问题