Pycharm 2017.1 EAP Python控制台和远程Docker解释器不能一起工作

我已经使用最小/ docker-django-mysite图像创build了一个纯Python项目来testingPython控制台function。

我已经使用本地Python解释器testing了Python控制台,它可以正常工作。

但是,当我将解释器更改为远程Docker解释器时,我得到的是以下输出:

22c422193587:python /opt/.pycharm_helpers/pydev/pydevconsole.py 0 0

PyDev控制台:启动。 无法连接到控制台进程。

处理完成退出代码137(由信号9:SIGKILL中断)

现在,我已经能够在运行的时候(在它超时之前)将一个bash shell挂接到容器中,并且看到控制台进程已经启动并且正在监听一个随机的端口。

此外,该短暂容器的Docker日志显示两个数字,其中一个是它正在侦听的同一本地端口(所以我猜另一个与预期的外部主机端口连接或类似的东西)。

时间过去了,进程和容器被杀死了。

顺便说一下,Docker容器对于运行/debuggingconfiguration工作正常,所以它能够启动一个远程进程。

我已经能够使用pydevd启动debugging服务器callback从容器到IDE,并正常debugging代码,所以我不知道什么可能是错的。

我认为临时容器不公开它的端口,所以我不知道IDE如何连接到该容器上的进程。

谢谢你的帮助。

我有这个确切的问题,这个问题似乎缺less我的docker容器和PyCharm自动生成的docker容器的克隆的环境variables。

下面是在Django中解决这个问题的一个特别的例子:

首选项>构build执行部署>控制台> Django控制台

默认的Django控制台启动脚本:

import sys print('Python %s on %s' % (sys.version, sys.platform)) print(sys.executable) import django; print('Django %s' % django.get_version()) sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) if 'setup' in dir(django): django.setup() import django_manage_shell; django_manage_shell.run(PROJECT_ROOT) 

您需要手动注入环境variables,否则解释器将无法读取POSTGRES_ENV_,如下所示:

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ["POSTGRES_ENV_DB_NAME"], 'USER': os.environ["POSTGRES_ENV_POSTGRES_USER"], 'PASSWORD': os.environ["POSTGRES_ENV_POSTGRES_PASSWORD"], 'HOST': os.environ["POSTGRES_PORT_5432_TCP_ADDR"], 'PORT': os.environ["POSTGRES_PORT_5432_TCP_PORT"], } } 

所以只需运行:

 docker exec -it CONTAINER_ID python -c 'import os; print(os.environ)' 

并将输出复制到您的剪贴板。 最后,更新你的Django控制台的启动脚本:

 import os os.environ = {"POSTGRES_ENV_DB_NAME":foo, "POSTGRES_ENV_POSTGRES_USER":bar} import sys print('Python %s on %s' % (sys.version, sys.platform)) print(sys.executable) import django; print('Django %s' % django.get_version()) sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) if 'setup' in dir(django): django.setup() import django_manage_shell; django_manage_shell.run(PROJECT_ROOT) 

确保PROJECT_ROOTWORKING_DIR_AND_PYTHON_PATHS不需要手动设置。