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

Posted

技术标签:

【中文标题】如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?【英文标题】:How to connect PyCharm to a python interpreter located inside a Docker container? 【发布时间】:2015-02-05 06:00:13 【问题描述】:

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

It was easy to setup with Vagrant,但还有apparently no official way to do it with Docker。

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

【问题讨论】:

SSH inside Docker containers is considered a bad practice,但到目前为止我想不出更好的解决方案... 他们的问题跟踪器现在确实存在问题:youtrack.jetbrains.com/issue/PY-15476 【参考方案1】:

更新:PyCharm 2017.1 有解决此问题的方法,请参阅blog entry

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

首先,我需要扩展名为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

docker build -t fgkrqworker .

添加它以便我可以从dockerdocker-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 端口映射到 VM 中可用的已知端口,回想一下,我使用的是 boot2docker,它在 VirtualBox 上运行,但需要映射到 PyCharm 可以访问的位置。在 VirtualBox 中,打开boot2docker VM 并选择Adapter 1。有时“附加到:”组合会自行取消选择,因此请注意这一点。在我的情况下,它应该选择 NAT

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

姓名:ssh_mapped; 协议:TCP; 主机IP:127.0.0.1; 主机端口:7722; 访客IP:; 访客端口:7722

注意:注意不要更改 boot2docker ssh 设置,否则您最终将无法正确启动 VM。

所以,此时我们有一个扩展我的目标容器的容器。它在端口22 上运行ssh 并将其映射到7722,因为其他容器可能想要使用22,并且在VirtualBox 环境中可见。 VirtualBox 将 7722 映射到 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 选项卡上,创建一个新的 Remote Python Interpreter。您可以选择部署配置并选择我们在上面创建的dockercompose 配置。主机 URL 应填写为 ssh://root@localhost:7722,Python 解释器路径可能为 /usr/bin/python。我们需要设置 PyCharm Helpers Path,因为默认值不会在重做的容器中继续存在。我实际上去了我的项目本地目录并在根目录中创建了一个.pycharm_helpers 目录,然后将此处的路径设置为/opt/applications/myproject/.pycharm_helpers,当我点击确定按钮时,它会将文件“向上”复制到目录中。我不知道它是否会自动创建它。

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

此时你可以进入Build、Execution、Deployment选项卡,在Console/Python Console下,选择我们上面创建的远程解释器并将工作目录设置为/opt/applications/myproject,你就可以在容器,如果你喜欢。

现在您需要创建一个运行配置,以便您可以远程调试您的 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

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

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

这是一个座位操作,所以可能存在我没有注意到的错误和不正确的假设。特别是 PyCharm 设置需要多次迭代,所以顺序可能不正确,如果失败,请再次尝试。这是很多东西,很容易跳过一些关键的东西。

【讨论】:

感谢您的详细解释。您是否设法在 docker 容器中调试了一个 python 类?我成功地运行了代码,但是在尝试使用远程解释器进行调试时,尝试打开其他端口失败。 @Elad92 是的,我有。但是,似乎有一些没有设置(正确)的 python 路径,或者看起来像这样的一些副作用。我怀疑解释器配置错误。不幸的是,我没有机会深入研究这一点,但它看起来是一种可以在调试和运行“普通”工作程序时转储路径并找出丢失的包的事情。我必须回到这一点,但一直在处理一些关键的非 python 问题,所以如果其他人解决了问题,请在此处添加您的发现。 @Elad92 如果您的 python 代码暴露了端口,而不是连接到端口,可能需要检查端口映射在 docker 和您正在使用的 VM 中的工作方式。经过几个月的使用,这仍然赶上了我。我开始依赖 `docker inspect' 来追踪这类问题。 我今天刚刚注意到 PyCharm 有一个用于 Docker 部署的插件。不确定这是否允许在容器内进行调试,但我会对其进行试验,看看是否可以得到它以避免我现在使用的所有凌乱的东西。他们在 blog.jetbrains.com/idea/2015/03/docker-support-in-intellij-idea-14-1 上有一个博客条目 Docker 插件似乎不允许在容器内进行调试,但它似乎为部署提供了一些简单的 Docker 映像支持,这很好,但这些东西很简单,而且并不像即插即用调试至关重要。尽管如此,至少它正在向前发展,并且鉴于 Docker 和 JetBrains 支持开发人员的努力很受欢迎,我认为他们很可能会到达那里。【参考方案2】:

通过在容器中安装 Pycharm 并从那里运行它,您可能会有点疯狂。您必须通过docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0.0 pycharm-image 执行此操作,但它应该可以正常工作。但请记住,所有 Pycharm 和您的源代码也将在该容器中。因此,请尽早并经常保存、提交和推送。

【讨论】:

它与现在浏览器内置的进程分离没有什么不同,除了你可以确定它使用多少内存/cpu。如果你问我,这在运行基于 Java 的程序时似乎很理想。 为什么不在容器中运行 pycharm 并挂载你的源目录?【参考方案3】:

特定于 PyCharm Professional Edition 2017.2 的步骤(但它们可能适用于 PyCharm CE)

为了让我的设置正常工作,我采取了几个步骤

第 1 步:环境

对您(或可能正在阅读此文章的任何人)项目结构的一些假设:

bleh
├── README.md
├── api
│   ├── Dockerfile  <---- this is the one we want to debug
│   ├── config.example.ini
│   └── src
│       ├── __init__.py    <---- this is a pycharm project
│       ├── __main__.py    <---- this is a pycharm project
│       └── ...
├── proxy
│   ├── Dockerfile
│   ├── config.example.ini
│   └── src
│       ├── ...
│       └── ...
├── webserver
│   ├── Dockerfile
│   ├── config.example.ini
│   └── src
│       ├── ...
│       └── ...
├── frontend
│   ├── Dockerfile
│   ├── config.example.ini
│   └── src
│       ├── ...
│       └── ...
├── db
│   ├── Dockerfile
│   ├── ...
│   └── migrations
│       ├── ...
│       └── ...
└── docker-compose.yml
注意 我使用bleh 作为我的项目名称仅作为示例。 注意我们还将假设该项目的绝对位置为/Users/myfunkyusername/Projects/bleh注意显然,就命名和位置而言,这都是随机的,请针对您的系统/项目进行调整 注意我们还将假设您希望实时调试api 服务,如稍后在docker-compose.yml 文件中所示

注意我们还将假设您的api 的内容只有Dockerfile 是这样的

FROM python
ADD config.example.ini /etc/bleh/config.ini
RUN chmod +x /usr/bin/bleh
COPY ./src /usr/bin/bleh
WORKDIR /usr/bin/bleh
RUN pip install -r requirements.txt
CMD ["sh", "-c", "python -m bleh --cfg=/etc/bleh/config.ini"]

注意我们假设您的唯一docker-compose.yml 有这些内容

version: '2'
services:

  api:
    build:
      context: ./api
    depends_on:
      - db
    expose:
      - "8080"
    networks:
      - default

  frontend:
    build:
      context: ./frontend
    ports:
        - "80:7000"
    networks:
      - default

  webserver:
    build:
      context: ./webserver
    depends_on:
      - frontend
    networks:
      - default

  proxy:
    build:
      context: ./proxy
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - webserver
      - api
    networks:
      - default

  db:
    build:
      context: ./db
    expose:
      - "3306"
    networks:
      - default

networks:
  default:
    driver: bridge

第 2 步:创建 Docker-Machine

专门为 bleh 项目创建 docker-machine

docker-machine create bleh

第三步:connect remote interpreter

来自PyCharm / Preferences / Build, Execution, Deployment / Docker 点击+ 选择Docker machine 单选按钮并在下拉菜单中突出显示bleh 的docker 机器 选择Apply 来自PyCharm / Preferences / Project:bleh / Project Interpreter 单击Project Interpreter 字段最右侧的齿轮图标并选择Add Remote 选择Docker单选按钮 使用Server 字段,选择之前为此项目创建的 docker 机器 选择包含此项目所需 Python 解释器的 docker 映像(例如 bleh_api) 无需更改Python interpreter path 点击OK

第四步:configure remote debugger

Run/Edit Configurations选择+添加配置 选择Python 使用 Script 字段,使用将要运行的 docker 容器上脚本文件的位置(在本例中为 /usr/bin/bleh/__main__.py,因为我们提供了目标脚本的绝对位置) 使用Script parameters 字段,提供CLI 参数(如果有)(模仿Dockerfile 的最后一个CMD 命令,即--cfg=/etc/bleh/config.ini) 使用Python Interpreter 字段,选择您之前建立的远程python 解释器 使用Working directory字段,选择Docker容器内Script所在的目录(例如/usr/bin/bleh) 使用Path mappings 字段,单击... 并选择本地(例如/Users/myfunkyusername/Projects/bleh/api/src)和远程(例如/usr/bin/bleh) 使用Docker container settings 字段,单击... 确保您选择了正确的 docker 容器(例如bleh_api:latest) 添加端口绑定容器/主机,模仿您在Dockerfile 中的内容(例如8080/8080 并使用tcp 协议暴露给0.0.0.0现在我还没有显示您的应用程序结构是的,但我们假设您是理智的,并且在您的应用程序中还指定 8080 作为您提供数据的端口。 添加卷绑定容器/主机/usr/bin/bleh//Users/myfunkyusername/Projects/bleh/api/src 确保将Network mode (thanks Piotr) 设置为&lt;name_of_project_directory&gt;_&lt;name_of_network_from_compose_file&gt;(例如bleh_default,您可以在正确的docker-machine 中使用docker network ls 进行确认)

第 5 步:晒太阳或多打头

这些是让我开始工作的 docker 和 PyCharm 设置的步骤。

我不会假装在每个步骤中都是正确的。我很乐意更新您发现的任何错误/改进。

【讨论】:

是否更容易将 sshd 添加到容器中,并将其视为普通的远程调试器(将 22 重定向到 8022 主机端口)? @lucid_dreamer 从开发人员的角度来看,您可能是对的。对于那些希望在 prod 上与 dev 环境保持相同结构的人来说,您提出的建议可能不是一个有吸引力的选择,因为通常它不赞成在容器上打开 ssh 甚至在容器上运行多个服务。 但是如果 docker engine (==host) 不在本地运行,这会起作用吗? 你指的是代码库不在本地机器上的开发(比如生产环境)?还是您指的是在另一个虚拟机中运行的 docker 设置,比如 vagrant? 可能是 (1) 在同一 TCP network 上的单独机器上运行的 docker 设置(可能是同一台机器上的 VM(无论是否流浪),在virtualbox 网桥,或者它可能是同一以太网 LAN 上的不同物理机器),或(2)在可通过 ssh 访问的远程服务器上运行的 docker 设置(远程服务器可能是物理的或虚拟的,或者是 vagrant 托管的或不托管的) :唯一重要的是我可以通过 ssh 访问它(您可以假设为 root))。如果您有适用于 (2) 的东西,我也可以将其用于 (1)。【参考方案4】:

在 PyCharm 5 中,他们增加了对 docker 的支持。您必须在 docker-machine 中配置您的 docker。

如果您还没有使用 docker-machine,您可以使用通用机器引擎连接到现有机器,然后通过 ssh 连接到 vagrant VM,如果您没有在 VM 中运行任何东西,则可以连接到 localhost。不幸的是,我没有找到绕过 ssh 到 localhost 的方法。

我还没有找到一种方法将卷挂载到他们使用的 docker 映像中,以便与我的开发树共享文件,但它可能是可能的。

【讨论】:

哟,我怀疑你仍然无法挂载卷,但我的回答确实显示了如何做到这一点,以防你想知道。【参考方案5】:

如果您只需要调试在 docker 容器中启动的代码,您可以使用 pycharm 的 python debug server 功能。对我来说,这比通过 SSH 访问远程解释器要麻烦得多。该解决方案的缺点是,对于自动完成和所有这类东西,您应该拥有容器解释器的本地副本并将其标记为项目的解释器(适用于自动完成,但我不确定是否可以从在这种情况下使用第三方库)或使容器的解释器文件对 pycharm 可见(根本未经测试)。另请注意,Python 调试服务器是feature of Professional edition。

通过 Python 调试服务器进行调试应该做什么:

1) 确保将项目所在的目录添加到容器中。它可能看起来像 Dockerfile 中的这一行:

ADD . /path/in/container

2) 将pycharm-debug.egg(对于Python3 为pycharm-debug-py3k.egg)从主机上安装pycharm 的目录复制到容器中的目录,该目录位于容器的PYTHONPATH 中。 开发者主机上 pycharm-debug.egg 的路径可能是:

对于 Mac:/Applications/PyCharm.app/Contents/pycharm-debug.egg 对于 Linux:/opt/pycharm/pycharm-debug.egg

3) 创建运行/调试配置以在主机上启动 Python 调试服务器,如 docs 的 To configure a remote debug server 部分所述。端口是您选择的任何主机的端口,但 IP 是可从容器访问的主机地址。可能是:

如果容器通过 boot2docker 运行,IP 很可能是 192.168.99.1 -- 带有 vbox 机器的 Host-only 网络中的主机地址 如果主机是Linux,IP可以通过ifconfig找到,对我来说是:
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

另外,不要忘记指定项目在开发者主机的路径和项目在容器的路径之间的路径映射。

This blog post also could be helpful for current step

4) 启动这个创建的配置(例如,通过Debug 按钮,直接从Run 一个)

5) 创建将启动您的项目的 python 脚本,并添加以下用于调试初始化的代码作为该脚本的第一行。 (确保pycharm-debug.egg 在PYTHONPATH 中,否则这段代码不能import pydevd):

   import pydevd
   pydevd.settrace('172.17.42.1', suspend=False, port=8765, stdoutToServer=True, stderrToServer=True)

6) 最后,您可以通过创建的脚本在容器中设置断点并从主机启动应用程序。例如:

docker-compose run 'container_name' python 'script_name' 'args'

启动时,您的启动脚本将连接到在主机上运行的 Python 调试服务器,并在断点处停止。调试器功能将照常使用。

【讨论】:

【参考方案6】:

现在还没有,但很快这应该不再是问题了,因为

从 PyCharm 4.1 EAP(4 月初)开始,PyCharm 将引入 Docker 支持

来源:http://blog.jetbrains.com/pycharm/2015/03/feature-spotlight-python-remote-development-with-pycharm/#comment-187772

【讨论】:

【参考方案7】:

如果你真的需要它,我认为在你的容器中包含 SSH 并没有那么糟糕。是的,自从引入docker exec 以来,它在其他用例中并不是必需的,但由于 Intellij/PyCharm 仅支持通过 SSH 的远程解释器,所以没关系。

您可以使用phusion/baseimage 作为一个很好的起点,使用 SSH 和您需要的任何 Python 版本(默认情况下与 PY3 一起提供)构建您自己的容器。

理论上,最好继续使用 Vagrant 来完成这项任务,因为它允许您创建一个可以在 Windows/OS X 机器(通过使用 boot2docker)和 Linux(本机 Docker)上工作的工作流。

实际上我无法让它在 OS X 上运行,因为你必须通过双 NAT 层才能进入 SSH 服务,而且看起来不可能向 Vagrant boot2docker 添加额外的接口盒子(Vagrant 1.7.2)。

【讨论】:

我肯定会为我的开发环境切换到 Vagrant;我已经在 Docker 上苦苦挣扎了好几个星期,但它无处可去……【参考方案8】:

我还没有尝试过,但我会尝试创建一个调用 docker exec ... 的 Bash 脚本,如 @Anto's answer。

然后,安装BashSupport extension。现在 create a new run configuration 将您的脚本作为 Bash 脚本运行。

【讨论】:

我不使用 docker,所以设置这一切需要付出很大的努力。这里有几个人显然已经有了这样的设置;如果他们都没有报告这是否有效,我会自己尝试。 嘿,谢谢你的回答。也许它可以解决问题,但这也意味着没有 PyCharm 的解释器设置以及随之而来的一切(与其他包集成、内置调试等)......还是我弄错了?【参考方案9】:

为了避免任何 SSH 开销(这对 Docker 来说非常有意义),docker exec 似乎绝对是要走的路。 不幸的是,到目前为止我无法让它工作。如果有人能填补空白,那就太好了。这是我所做的(使用 PyCharm 4.0.4 和 Docker 1.4.1):

    创建一个名为python_myproject.sh 的文件,其中包含以下内容:

    #!/bin/bash
    docker exec -i myproject_container /path/to/containers/python2.7
    

    请注意,文件名必须以python 开头,否则 PyCharm 会报错。

    在 PyCharm 的设置中,在 Project Interpreter 下,添加一个新的本地解释器。给它你的python_myproject.sh 文件的路径。


这就是我卡住的地方。经过相当长的加载时间(颤动说“设置库文件”)后,出现一个标题为“无效 Python SDK”的窗口并显示:

无法设置 python SDK 在 /path/to/python_myproject.sh. SDK 似乎无效。

~/.PyCharm40/system/log/.idea:

2015-02-19 17:33:30,569 [ 166966]   WARN - ution.process.OSProcessHandler - Cannot kill process tree. Trying to destroy process using Java API. Cmdline:
2015-02-19 17:34:30,628 [ 227025]   WARN - ution.process.OSProcessHandler - Cannot kill process tree. Trying to destroy process using Java API. Cmdline:
2015-02-19 17:34:30,653 [ 227050]   INFO - rains.python.sdk.PythonSdkType - 
Timed out

【讨论】:

这行不通,因为 PyCharm 期望和实际的 Python 解释器,并且不仅仅是使用参数调用它。 脚本可能无法正常工作,因为它没有将命令行参数传递给 python 解释器。尝试在docker exec 命令的末尾添加"$@" @taleinat:多亏了这个建议,它肯定更进一步:PyCharm 可以建立 Docker 的 python (2.7.9) 的版本!但不幸的是仍然以The SDK seems invalid 结尾,并且PyCharm 的日志文件显示:INFO - rains.python.sdk.PythonSdkType - /path/to/containers/python2.7: can't open file '~/.pycharm-4.0.4/helpers/syspath.py': [Errno 2] No such file or directory 最后,我切换到了 Vagrant。恕我直言,对于(基于 PyCharm 的)开发环境,这更容易使用和配置。 仍在考虑如何让它与 Docker 一起工作,您应该在运行 docker exec 命令之前尝试将目录 ~/.pycharm-4.0.4/helpers/ 复制到 Docker 实例中(到相同的路径!)。这至少应该可以通过最近的错误。如果可行,如果 Docker 实例中不存在该目录,则可以更新 bash 脚本以最初复制该目录。【参考方案10】:

使用 Docker 1.3,使用 exec 命令构造 Python 解释器的路径:

sudo docker exec container_name /usr/bin/python

见https://docs.docker.com/reference/commandline/cli/#exec,http://forum.jetbrains.com/thread/PyCharm-2224

您可以在容器内安装 SSH,然后公开端口,但这不是容器的预期使用方式,因为您会使它们膨胀。

【讨论】:

你能确认一下,exec 肯定可以用来连接 PyCharm 中的远程调试器吗? 我无法确认,因为我不使用 PyCharm。你为什么不试试呢? @dukebody,你用什么 IDE 进行 python 开发——如果有的话?我想知道 Visual Studio 的 sublime Text REPL 或 Python 工具是否取决于使用 docker exec 的能力 - 我想我必须尝试一下才能确定... 有人设法让docker exec 使用 PyCharm 吗?在 PyCharm 中,我只看到选择 python 解释器路径的选项。它不接受将启动解释器的任意命令。 fyi forum.jetbrains.com/thread/PyCharm-2224 这个问题中提到的没有答案。我还没有找到这样做的方法。

以上是关于如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?的主要内容,如果未能解决你的问题,请参考以下文章

Pycharm,Docker和GUI

如何将 Docker.DotNet 库连接到远程 Linux docker

如何将nodeJS docker容器连接到mongoDB

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?

如何将我的 docker 连接到远程数据库?

如何将我的 docker Django 实例连接到我的 docker mysql 实例?