我从Docker开始,但是我不知道如何配置PyCharm来使用位于容器中的python解释器。
这是很容易设置与流浪汉,但显然没有正式的方式来做这件事与多克尚未。
我应该用暴露的ssh端口准备特殊的Docker映像吗?如何更容易做到这一点?
现在还没有,但很快这就不再是问题了,因为
从PyCharm 4.1 EAP开始,将在PyCharm中引入Docker支持(4月初)
资料来源:http://blog.jetbrains.com/pycharm/2015/03/feature-spotlight-python-remote-development-with-pycharm/#comment-187772
为了避免任何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
更新: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 .
这添加了它,以便我可以从docker
或docker-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
127.0.0.1
7722
7722
注意:注意不要更改boot2dockerssh
设置,否则最终将无法正确启动VM。
因此,在这一点上,我们有一个扩展目标容器的容器。它在端口22
上运行ssh,并将其映射到7722
,因为其他容器可能希望使用22
,并且在VirtualBox环境中可见。VirtualBox将7722
到7722
映射到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