如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?

2024-01-29

我从 Docker 开始,但我不知道如何配置 PyCharm 以使用位于容器中的 python 解释器。

使用 Vagrant 设置很容易 https://www.jetbrains.com/pycharm/quickstart/configuring_for_vm.html,但是有显然没有使用 Docker 的官方方法 http://forum.jetbrains.com/thread/PyCharm-2224 yet.

我应该准备带有暴露 ssh 端口的特殊 Docker 镜像吗?如何更轻松地做到这一点?


UPDATE:PyCharm 2017.1 针对这个问题有解决方案,看这个博客条目 http://blog.jetbrains.com/pycharm/2017/03/docker-compose-getting-flask-up-and-running/

这是我解决问题的方法。我的情况是,我被分配对一个 Web 应用程序的特定区域进行干预,该应用程序使用 docker-compose 创建一组四个容器。 Docker-compose 是一种元 docker,可以通过一个命令管理多个 docker 容器。我不想破坏他们现有的设置,因为很多事情都依赖于它。但由于我正在处理其中一张图像中的一个特定部分,因此我决定使用 ssh 扩展其中一个容器,以便可以从 PyCharm 进行调试。此外,我希望应用程序在启动时正常运行,只有强制它退出然后从 PyCharm 连接到它,我才会有一个可调试组件。这是我在 Mac 上所做的,使用 boot2docker(在 VirtualBox 上)正确设置 docker。

首先,我需要扩展目标容器,称为jqworker。我要使用"supervisior"承担管理事务的繁重工作。

FROM jqworker

# Get supervisor to control multiple processes, sshd to allow connections.
# And supervisor-stdout allows us to send the output to the main docker output.
RUN apt-get update && apt-get install -y supervisor openssh-server python-pip \
  && pip install supervisor-stdout \
  && mkdir -p /var/run/sshd  \
  && mkdir -p /var/log/supervisor \
  && mkdir -p /etc/supervisor/conf.d

COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Fix up SSH, probably should rip this out in real deploy situations.
RUN echo 'root:soup4nuts' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# Expose SSH on 22, but this gets mapped to some other address.
EXPOSE 22

# Replace old entrypoint with supervisiord, starts both sshd and worker.py
ENTRYPOINT ["/usr/bin/supervisord"]

Supervisor 允许我通过一个命令运行多个任务,在本例中是原始命令和 SSHD。是的,每个人都说 docker 中的 SSHD 是邪恶的,容器应该这样那样等等,但是编程是为了解决问题,而不是遵守忽略上下文的任意指令。我们需要 SSH 来调试代码,并且不会将其部署到现场,这是我们扩展现有容器而不是将其添加到部署结构中的原因之一。我在本地运行它,以便可以在上下文中调试代码。

这里是supervisord.conf文件,请注意我正在使用supervisor-stdout包将输出直接输出到主管,而不是记录数据,因为我更喜欢在一个地方看到所有数据:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:worker]
command=python /opt/applications/myproject/worker.py -A args
directory=/opt/applications/myproject
stdout_events_enabled=true
stderr_events_enabled=true

[eventlistener:stdout]
command = supervisor_stdout
buffer_size = 100
events = PROCESS_LOG
result_handler = supervisor_stdout:event_handler

我有一个包含上述两个文件的构建目录,我从那里的终端构建了Dockerfile with:

docker build -t fgkrqworker .

这添加了它,以便我可以从docker or docker-compose。不要跳过尾随点!

由于该应用程序使用docker-compose要运行一组容器,现有的WORKER容器将被替换为能解决我的问题的容器。但首先我想表明,在我的另一部分docker-compose.yml我定义了从容器到本地硬盘驱动器的映射,这是被映射的多个卷之一:

volumes: &VOLUMES
  ? /Users/me/source/myproject:/opt/applications/myproject

然后是我的容器的实际定义,它引用了上面的内容VOLUMES:

jqworker: &WORKER
  image: fgkrqworker
  privileged: true
  stdin_open: true
  detach: true
  tty: true
  volumes:
    <<: *VOLUMES
  ports:
    - "7722:22"

这会将 SSH 端口映射到虚拟机中可用的已知端口,记得我正在使用boot2docker它依赖于 VirtualBox,但需要映射到 PyCharm 可以访问它的位置。在 VirtualBox 中,打开boot2docker虚拟机并选择Adapter 1。有时,“附加到:”组合会自行取消选择,因此请注意这一点。就我而言,它应该有NAT已选择。

单击“端口转发”并将内部端口映射到本地主机上的端口,我选择使用相同的端口号。它应该是这样的:

  • Name: ssh_mapped;
  • 协议:TCP;
  • Host IP:127.0.0.1;
  • 主机端口:7722;
  • 访客 IP:;
  • 访客端口:7722

Note:注意不要更改 boot2dockerssh设置,否则您最终将无法正确启动虚拟机。

所以,此时我们有了一个扩展我的目标容器的容器。它在端口上运行 ssh22并将其映射到7722因为其他容器可能想要使用22,并且在 VirtualBox 环境中可见。 VirtualBox 地图7722 to 7722到本地主机,你可以通过 ssh 进入容器:

ssh root@localhost -p 7722

然后将提示输入密码“soup4nuts”,您应该能够找到特定于您的容器的内容,以验证它是否正确并且一切正常。如果我将其部署在本地计算机以外的任何地方,我不会弄乱 root,所以请注意。这仅适用于本地调试,您应该三思而行在实时站点上执行此操作.

如果您使用过 PyCharm 的远程调试,此时您可能可以弄清楚其余部分。但我是这样设置的:

首先,请记住我有docker-compose.yml映射项目目录:

? /Users/me/source/myproject:/opt/applications/myproject 

在我的容器里/opt/applications/myproject实际上是/Users/me/source/myproject在我的本地硬盘上。所以,这是我的项目的根源。我的 PyCharm 将此目录视为项目根目录,我希望 PyCharm 编写.pycharm_helpers在这里,以便它在会话之间持续存在。我正在管理 mac 端的源代码,但 PyCharm 认为它是其他地方的 unixy 盒子。是的,在 JetBrains 整合 Docker 解决方案之前,这有点混乱。

首先,转到 Project X/Project Structure 并创建本地映射的内容根,在我的例子中这意味着/Users/me/source/myproject

稍后再回来补充.pycharm_helpers对于排除的集合,我们不希望它最终进入源代码管理或混淆 PyCharm。

转到“构建”、“执行”、“部署”选项卡,选择“部署”并创建一个 SFTP 类型的新部署。主机是localhost,端口是7722,根路径是/opt/applications/myproject用户名是root密码是soup4nuts我选中了保存密码的选项。我将我的部署命名为“dockercompose”,以便稍后能够将其挑选出来。

在“部署映射”选项卡上,我将本地路径设置为/Users/me/source/myproject以及部署和 Web 路径到单个“/”,但由于我的代码不对应于 URL 并且我不使用它来调试,因此它是 Web 路径设置中的占位符。我不知道你如何设置你的。

在 Project X/Project Interpreter 选项卡上,创建一个新的远程 Python 解释器。您可以选择部署配置并选择dockercompose我们上面创建的配置。主机 URL 应填写为ssh://root@localhost:7722Python 解释器路径可能是/usr/bin/python。我们需要设置 PyCharm Helpers Path,因为默认值将无法在重做的容器中保留下来。我实际上转到了我的项目本地目录并创建了一个.pycharm_helpers根目录下,然后将此处的路径设置为/opt/applications/myproject/.pycharm_helpers当我点击“确定”按钮时,它将文件“向上”复制到目录中。我不知道它是否会自动创建它。

不要忘记.pycharm_helpers目录可能应该被排除在项目根选项卡上。

此时,您可以转到“构建”、“执行”、“部署”选项卡,然后在“控制台/Python控制台”下,选择我们上面创建的远程解释器并将工作目录设置为/opt/applications/myproject如果您愿意,您可以在容器中运行 Python 控制台。

现在您需要创建一个运行配置,以便您可以远程调试您的 python 代码。进行新的 Python 配置并将脚本设置为用于在容器中启动 python 代码的脚本。我的,从主管设置来看,上面是:

/opt/applications/myproject/worker.py -A args

所以我将脚本设置为/opt/applications/myproject/worker.py和参数-A args.

选择我们上面创建的远程解释器,以及需要的工作目录,对我来说是/opt/applications/myproject对我来说就可以了。

现在我想进入我的容器并停止worker.py脚本,以便我可以启动调试版本。当然,如果您愿意,可以忽略默认运行脚本,仅使用容器进行调试。

我可以打开 ssh 会话来停止脚本,但 docker 提供了一个有用的命令,可以通过将脚本传递到环境中来为我完成工作。

$> docker exec -i -t supervisorctl stop worker

因为我的进程被命名为“worker”。请注意,您可以通过替换来重新启动stop命令与start.

现在,在 PyCharm 中使用上面创建的运行配置启动调试会话。它应该连接并启动并在窗口中为您提供控制台输出。自从我们杀死了监督最初启动的那一个以来,它就不再连接了。

这是凭感觉进行的操作,因此可能存在我没有注意到的错误和不正确的假设。特别是,PyCharm 设置需要几次迭代,因此顺序可能不正确,如果失败,请尝试重试。这是很多东西并且很容易跳过一些关键的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器? 的相关文章

  • 通过 Python 与 Windows 控制台应用程序交互

    我在 Windows 上使用 python 2 5 我希望通过 Popen 与控制台进程交互 我目前有一小段代码 p Popen console app exe stdin PIPE stdout PIPE issue command 1
  • 如何测试顶级窗口是否打开?

    我感觉 Python 编程可能不是我的菜 我创建了一个 tkinter GUI 它使用按钮回调来打开另一个窗口 其他搜索说这个窗口应该是顶级窗口 并且它工作得很好 但是每次按下按钮时它都会打开另一个相同的窗口 如据我所知 窗口 问题 如何测
  • 如何配置散景图以具有响应宽度和固定高度

    我使用通过组件功能嵌入的散景 实际上我使用 plot sizing mode scale width 它根据宽度进行缩放并保持纵横比 但我想要一个响应宽度但固定或最大高度 这怎么可能实现呢 有stretch both and scale b
  • 错误只有 size-1 数组可以转换为 Python 标量

    我有这个代码 for a in data X for i in a if not i isdigit x hash i data X column row x row row 1 row 0 column column 1 desired
  • 如何将经度和纬度转换为国家或城市?

    我需要将经度和纬度坐标转换为国家或城市 python中有这样的例子吗 提前致谢 我使用谷歌的API from urllib2 import urlopen import json def getplace lat lon url http
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 使用 python 通过搜索端点从 Spotify API 获取曲目

    因此 我尝试使用 API 的搜索端点进行搜索 从而从 Spotify API 获取曲目 请参阅文档 https developer spotify com documentation web api reference search sea
  • 如何通过 Docker 使用 wkhtmltopdf

    当我在 Docker 容器中使用 wkhtmltopdf 版本 0 12 2 4 通过 apt get 安装 时 它失败并显示 QXcbConnection Could not connect to display 当我设置环境变量DISP
  • 01 无效令牌[重复]

    这个问题在这里已经有答案了 嘿 学习 python3有一段时间了 遇到字典和dictionary name get 方法并尝试获取随机键值 问题 data data get key 1 它有效并且返回 1 但如果我使用data get ke
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • Python3模拟用另一个函数替换函数

    如何使用 python 中的另一个函数来模拟一个函数 该函数也将提供一个模拟对象 我有类似以下操作的代码 def foo arg1 arg2 r bar arg1 does interesting things 我想替换的实现bar函数 让
  • 指定 Parquet 属性 pyspark

    如何在 PySpark 中指定 Parquet 块大小和页面大小 我到处搜索 但找不到任何有关函数调用或导入库的文档 根据火花用户档案 https mail archives apache org mod mbox spark user 2
  • Scrapy - 不会爬行

    我正在尝试运行递归爬行 由于我编写的爬行不能正常工作 因此我从网络上提取了一个示例并进行了尝试 我真的不知道问题出在哪里 但是爬行没有显示任何错误 谁能帮我这个 另外 是否有任何逐步调试工具可以帮助理解蜘蛛的爬行流程 非常感谢任何与此相关的
  • Python:使用列表创建二叉搜索树

    我的代码的目标是从 txt 文件中获取每个单独的单词并将其放入列表中 然后使用该列表创建二叉搜索树来计算每个单词的频率 并按字母顺序打印每个单词及其频率 中的每个单词只能包含字母 数字 或 我无法用我的初学者编程知识来做的部分是使用我拥有的
  • 如何使用 python-gnupg 加密大型数据集而不占用所有内存?

    我的磁盘上有一个非常大的文本文件 假设它是 1 GB 或更多 还假设该文件中的数据有 n每 120 个字符一个字符 我在用python gnupg https pythonhosted org python gnupg 对此文件进行加密 由
  • Docker容器内的动态监听端口

    我有一个应用程序 在使用其默认端口建立一些连接后 开始打开 侦听 新的随机端口来处理现有连接 然后删除它们 视频通话 它还在通信协议内交换其IP地址和端口 我能够解决IP地址问题 但仍然无法找到一种方法来动态告诉主机的IPTABLES在Do
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • 如何指定一个变量作为类或类实例的成员变量?

    在最新的 Python 2 7 x 中 给定类定义内的任何成员变量 该成员变量是否始终处于类级别 因为它是由该类的所有实例共享的单个变量 在类的定义中 如何指定 类定义中的哪些成员变量属于该类 因此由该类的所有实例共享 以及 哪些属于该类的
  • 提供节点名或服务名,或未知

    我收到这个 Python 错误 File Library Frameworks Python framework Versions 2 7 lib python2 7 urllib2 py line 1184 in do open rais

随机推荐

  • python eval 函数中的 \r\n 与 \n

    为什么 eval 函数不能与 r n 一起使用 而可以与 n 一起使用 例如 eval for i in range 5 r n print hello 不起作用 eval for i in range 5 n print hello 有效
  • java中的package语句有什么理由应该放在开头吗?

    我从 Java 编程语言开始 我有一个简单的问题 在 java 包中 如果类是包的一部分 则 package 语句必须位于源代码文件中的第一行 位于可能存在的任何 import 语句之前 包声明应该放在开头有什么有价值的理由吗 有理由吗 当
  • 使用elasticsearch-river-mysql将数据从MySQL数据库流式传输到Elasticsearch

    我想用Elasticsearch 河 mysql https github com scharron elasticsearch river mysql以便不断地将数据从 MySQL 数据库传输到 ElasticSearch 我是 ES 和
  • 检查函数是否属于/哪个工具箱

    我们的工作站上安装了一个相对 丰富 的matlab 我现在需要发送一些代码到 并且我想检查它需要哪些工具箱才能正常工作 最简单的方法是什么 如何找出某个功能属于哪个工具箱 我看到两个问题 我要发送的函数需要哪些工具箱 你需要生成一个依赖性报
  • STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

    我正在使用 Django 1 7 将我的网站部署到生产服务器并运行时collectstatic 我收到以下错误消息 django core exceptions ImproperlyConfigured STATICFILES DIRS 设
  • 将反应本机升级到最新版本

    我有一个在react native 0 49 3 上运行的应用程序 我想升级到最新版本 v0 57 4 我应该逐步更新它吗 例如 0 49 gt 0 50 gt 0 51 等 或者我可以直接更新到最新版本吗 你建议使用react nativ
  • 委托和谓词查询

    我正在学习 lambda 并试图理解为什么 同时拥有 EmployeeFilterAge 类 如下所示 public class EmployeeFilterAge int age public EmployeeFilterAge int
  • iOS 8 Safari 打印重定向不会停止 javascript 执行

    我需要提供在成功保存时以及打印重定向到搜索页面后打印标签的能力 这适用于 chrome firefox ie iOS 6 7 safari 等 但是 当从 javascript 发出 window print 时 iOS 8 似乎不再停止
  • 运行 zipalign 时出错

    尝试在 Eclipse 中导出签名的 apk 时出现此错误 运行 zipalign 时出错 打不开 作为 zip 存档 我已运行 帮助 gt 检查更新 以确保安装了最新更新并且 SDK 工具也是最新的 我收到了同样的错误消息 让我发疯 直到
  • 从类路径中动态删除 jar

    我有一个要求 必须根据从 UI 捕获分布的分布来更改 jar 一组与另一组的分布各不相同 如果选择了某个发行版 则必须以动态 编程方式将与该发行版相关的 jar 添加到类路径中 如果选择另一个发行版 则必须动态地从类路径中删除添加到类路径的
  • 返回只出现一次的数字 (JavaScript)

    假设我有数组 1 2 3 5 2 1 4 如何让 JS 返回 3 4 5 我在这里查看了其他问题 但它们都是关于删除多次出现的数字的副本 而不是原始文件和副本 Thanks Use Array filter https developer
  • 调用 win32 API 并对类函数进行回调

    我试图通过将一些现有的 win32 UI 代码放入一个类中来清理它 以前我有一个像这样的 AppDlgProc 函数 BOOL CALLBACK AppDlgProc HWND hDlg UINT uMsg WPARAM wParam LP
  • 将 JTextField 添加到游戏菜单 (graphics2d)

    我正在开发一款多人游戏 在菜单中 我需要添加一个字段 玩家可以在其中输入主机 IP 我正在使用 Graphics2D 制作菜单 并循环更新它 JFrame screenFrame screen getFullScreenWindow whi
  • 自定义 UITableViewCell prepareForReuse 未按预期工作

    My prepareForReuse无法正常工作 我有一个UITableView那应该有一个login UIButton仅在表的第一部分的第一行中 但当 在prepareForReuse 我删除了login按钮 它会保留并进入下一批行 视频
  • 在 Jekyll 中显示一个文件夹下的页面?

    我认为管理 Jekyll 页面的本机方式 即通过在根文件夹下创建 md 文件 文件夹 有点混乱 因此 我想将我想要显示的每个页面放入名为 pages 的文件夹中 此外 我希望这些页面具有级联结构 假设我的文件夹具有以下结构 pages gt
  • 为什么标签的 href 属性会打印到屏幕上? [复制]

    这个问题在这里已经有答案了 可能的重复 显示带有蓝图的 URL 的超链接 https stackoverflow com questions 4258417 hyperlinks showing url with blueprint DOM
  • 扩展 umbraco 仪表板

    我想将我自己的部分添加到 umbraco 仪表板 以便我可以将我自己的管理部分集成到现有的登录 管理结构中 这是否可以在不编辑和重新编译 umbraco 源代码本身的情况下实现 推荐吗 如果是这样 有人有资源开始这样做吗 是的 这是可能的
  • Ios的Uiwebview可以打开.mht或者.mhtml文件吗

    是否有任何标准将 mht 文件转换为 html 所以我可以在 iosWebview 中打开它 我可以在 ios webview 中打开 mht 文件吗 是否有任何库或第三方工具可以执行相同的操作 None
  • 我无法使用 ChromeDriverManager().install() 安装 ChromeDriverManager

    我已经学习Python 2个月了 这个错误从来没有在我身上发生过一次 但突然我无法下载CHROMEDRIVERMANAGER 每当我进入其网站手动下载它时 它就会说 该 XML 文件似乎没有任何样式信息 文档树如下所示 错误 Access
  • 如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?

    我从 Docker 开始 但我不知道如何配置 PyCharm 以使用位于容器中的 python 解释器 使用 Vagrant 设置很容易 https www jetbrains com pycharm quickstart configur