当前位置: 首页 > 知识库问答 >
问题:

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

宇文良骏
2023-03-14

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

这是很容易设置与流浪汉,但显然没有正式的方式来做这件事与多克尚未。

我应该用暴露的ssh端口准备特殊的Docker映像吗?如何更容易做到这一点?

共有3个答案

薛彭薄
2023-03-14

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

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

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

宓昂雄
2023-03-14

为了避免任何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的设置中,在项目解释器下,添加一个新的本地解释器。为它提供您的python\u myproject.sh文件的路径。

    这就是我被困的地方。在相当长的加载时间后(throbber表示设置库文件),出现一个名为无效Python SDK的窗口,并表示:

    无法在/path/to/python\u myproject.sh设置python SDK。
    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
    

  • 楚乐逸
    2023-03-14

    更新:PyCharm 2017.1已经解决了这个问题,请参阅此博客条目

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

    首先,我需要扩展名为jqworker的目标容器。我将使用“主管”来完成管理工作的繁重任务。

    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"]
    

    主管允许我从一个命令运行多个任务,在本例中是原始命令和SSHD。是的,每个人都说docker中的SSHD是邪恶的,容器应该这样那样等等,但是编程是关于解决问题的,而不是符合忽略上下文的任意格言。我们需要SSH调试代码,而不是将其部署到字段,这就是我们扩展现有容器而不是将其添加到部署结构中的原因之一。我在本地运行它,这样我就可以在上下文中调试代码。

    这里是supervisord.conf文件,请注意,我正在使用主管-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-comment调用它。不要跳过尾随点!

    由于应用程序使用了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端口映射到虚拟机中可用的已知端口,回想一下,我使用的是VirtualBox上的boot2docker,但需要映射到PyCharm可以获取的位置。在VirtualBox中,打开boot2docker VM并选择Adapter 1。有时“附加到:”组合会取消选择,所以要小心。在我的例子中,它应该选择NAT

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

    • 名称:ssh_-mapped
    • 协议:TCP
    • 主机IP:127.0.0.1
    • 主机端口:7722
    • 嘉宾叶:
    • 来宾端口:7722

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

    因此,在这一点上,我们有一个扩展目标容器的容器。它在端口22上运行ssh,并将其映射到7722,因为其他容器可能希望使用22,并且在VirtualBox环境中可见。VirtualBox将77227722映射到localhost,您可以通过以下方式ssh到容器中:

    ssh root@localhost -p 7722
    

    然后会提示输入密码“soup4nuts”,您应该能够找到特定于您的容器的东西,以验证它是否正确,并且一切正常。如果我在本地机器以外的任何地方部署它,我就不会干扰root,所以请注意。这只是为了在本地调试,您应该三思而后行。

    此时,如果您使用了PyCharm的远程调试,您可能会了解到它的其余部分。但我是这样设置的:

    首先,回想一下我有docker compose.yml映射项目目录:

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

    在我的容器中,/opt/应用程序/myproject实际上是本地硬盘上的/用户/我/源/myproject。所以,这就是我项目的根源。我的PyCharm将这个目录视为项目根目录,我希望PyCharm编写。pycharm_helpers在这里,以便它在会话之间保持不变。我在Mac方面管理源代码,但PyCharm认为它在其他地方是一个unixy box。是的,在JetBrains集成Docker解决方案之前,这有点笨手笨脚。

    首先,转到项目X/项目结构,创建本地映射的内容根,在我的例子中,这意味着/用户/我/源代码/我的项目

    稍后,请返回并将.pycharm\u helpers添加到排除的集合中,我们不希望它最终出现在源代码管理中或混淆pycharm。

    转到生成、执行、部署选项卡,选择部署并创建SFTP类型的新部署。主机是localhost的,端口7722,根路径是/opts/应用程序/myproject,用户名是root,密码是soup4Nuts,我选中了保存选项密码。我将我的部署命名为dockercomment,这样我以后就可以把它挑出来了。

    在Deployment Mappings选项卡上,我将本地路径设置为/Users/me/source/myproject,将Deployment和web路径设置为单个“/”,但由于我的代码与URL不对应,并且我不使用它进行调试,因此它是web路径设置中的占位符。我不知道你会怎么做。

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

    不要忘记,.pycharm\u helpers目录可能应该排除在项目根选项卡上。

    此时,您可以转到Build、Execution、Deployment选项卡,并在Console/Python Console下,选择我们在上面创建的远程解释器,将工作目录设置为/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设置需要几次迭代,因此顺序可能不正确,如果失败,请再次尝试。这是很多东西,很容易跳过一些关键的东西。

     类似资料:
    • 我正在写一个go应用程序,它被dockerized在两个容器:db和app。 当启动容器'docker-compose up‘时,我看到消息:dial tcp:lookup dbpgsql on 127.0.0.11:53:没有这样的主机

    • 我无法将作为docker容器运行的应用程序连接到mongoDB。我知道新版本docker compose不推荐使用“链接”,所以我尝试使用自定义网络。我的码头工人。yml: 我的应用程序的Dockerfile: 当我运行时,我在应用程序中得到以下错误消息: 在第一次连接时连接到服务器[127.0.0.1:27017]失败[MongoNetworkError:连接ECONNREFUSED127.0.

    • 问题内容: 我在将作为docker容器运行的nodeJS应用程序连接到mongoDB时遇到问题。让我解释一下到目前为止我做了什么: 如您所见,已经有一个mongo docker容器正在运行。 现在我正在运行我的nodeJS应用程序docker容器(这是来自meteorJS的构建): 在这个Docker容器中,我想通过运行以下命令来运行应用程序: 现在我得到了错误 我已经尝试通过设置以下内容来设置M

    • 我的数据库连接是用下面的类处理的: 这是我的spring boot控制器 下面是我的dockerfile: 我读了这里和这里提到的解决方案。也阅读了一些教程,但我无法将这些解决方案中的任何一个适合我的代码。在我的代码中,我应该在哪里更改?

    • 问题内容: 我正在练习制作一个与PostgreSQL数据库交互的Golang Web应用程序,每个应用程序都在各自的容器上运行。 我正在运行容器 但是我似乎无法正确设置postgres容器。 为简便起见,指向s和其他设置文件的链接位于此要点上(如果您需要在此处,请告诉我)。 工作良好。但是,当应用程序尝试使用以下方法打开数据库连接时: 我从docker compose得到以下错误: 如何使两个容器

    • 问题内容: 我正在使用docker- compose 运行一个应用程序。一切正常,通过连接到容器内的Mongo,我可以看到所有数据。但是,当我连接到RoboMongo时,我看不到任何数据。 我该如何解决这个问题? 问题答案: 您应该在Docker容器内建立到MongoDB的Robomongo SSH隧道连接。首先,您应该在docker容器中安装一个ssh服务器。 https://docs.dock