如何从Docker运行PyCharm



我能够从保存Dockerfile的路径构建一个docker映像,其中包含PyCharm的安装说明。在构建图像时,我可以查看创建的图像列表。然后我输入docker-run-ti-pycharm,这是我在终端中构建的映像的名称,我让我的容器运行。现在我被困在如何从这个容器加载Pycharm上了?感谢

在docker内部或外部运行IDE时存在几个问题。

当在主机上运行PyCharm并在docker中使用python解释器时,可以处理共享代码库

  1. PyCharm的远程解释器功能

    • 通过SSH:https://www.jetbrains.com/help/pycharm/configuring-remote-interpreters-via-ssh.html
    • 通过Docker TCP端口:https://www.jetbrains.com/help/pycharm/using-docker-as-a-remote-interpreter.html
    • 代码驻留在主机上,这是PyCharm提供静态分析所必需的。https://www.jetbrains.com/help/pycharm/code-inspection.html

    • 每当你想运行代码时,它都需要与远程系统同步。我不确定同步的行为,所以我不知道同步是双向的,还是主机上的PyCharm总是覆盖远程系统(docker容器)https://www.jetbrains.com/help/pycharm/configuring-synchronization-with-a-remote-host.html

  2. 在docker容器中装载主机目录:

    • Windows上的Docker Desktop在Docker容器中安装Windows目录时有很多限制。
      • linux容器无法更改Windows目录中文件的权限。这些文件似乎总是具有755(rwxr-xr-x)权限。如果您试图在linux容器中装载openssh配置或密钥,linux上的ssh将拒绝使用这些文件,因为它们不安全。https://docs.docker.com/v17.09/docker-for-windows/troubleshoot/#permissions-共享卷的数据目录错误
      • linux容器不会获取文件系统事件(inotify),使其知道从Windows装载的文件上的文件已经更改。如果您在开发中使用./manage.py runserver来运行Django,它将需要轮询代码库中的所有文件,以查看是否有任何更改。我还没有测试Django的民意调查。如果它不能足够快地工作,您可能必须重新启动Django,以便它反映您的更改。https://william-yeh.net/post/2019/06/inotify-in-containers/
      • 当主机是Mac时,这会更好地工作,因为osxfs装载的卷与linux容器一起工作得更好。https://docs.docker.com/docker-for-mac/osxfs/
        1. 在Windows上的linux容器中装载目录
      • 带有WinFSP的SSHFS允许Windows通过ssh装载文件。这需要在linux容器中安装ssh服务器。linux容器上的NFS或Samba服务器也可以用于文件共享,但也存在类似的问题
      • Windows上的PyCharm不支持对文件更改进行轮询。如果您通过ssh、NFS或SMB装载代码库,PyCharm将不知道您是否添加了新文件。如果您为代码库切换到不同的分支,这尤其是一个问题

目前,我正在尝试在linux容器中运行PyCharm。

  • 使用Docker Desktop for Windows,您不能使用JetBrains Toolbox来安装PyCharm,因为它是与需要支持fuse内核驱动程序的AppImage一起安装的。docker似乎在这方面取得了进步,但我的Windows 10版本不在Insider预览版中,所以我还没有测试这些新功能。https://www.infoq.com/news/2019/12/docker-desktop-windows-fuse/
  • 你可以安装pycharm tarball并运行它。您肯定需要增加内存,并在Docker Desktop的资源设置中进行交换
  • 为了让linux容器能够显示gui应用程序,Windows需要运行一个xserver,比如VcXsrv。启动后,可以设置env varDISPLAY=localhost:0。通过指定localhost而不仅仅是DISPLAY=:0,您运行的任何gui应用程序都会知道它需要通过TCP连接到VcXsrv,而不是寻找不存在的unix套接字
  • 通过在linux容器中运行PyCharm,我也不必考虑Git中的crlf转换设置。https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

好的,我现在明白你的问题了。您需要能够运行您的主机没有依赖项的python脚本。


顺便说一句,管理python依赖关系的一种常见方法是使用virtualenv和virtualenvwrapper。如果你不熟悉它,并且想要一种简单的方法来管理python依赖关系,你应该阅读更多关于它的内容,因为这可能是最好的解决方案。


使用Docker作为管理python依赖关系的一种方式也可以很好地工作,这是一种相对较新的做法,可能会变得越来越普遍。在这种情况下,您不希望从Docker容器内部运行PyCharm。相反,您应该在主机上使用PyCharm进行开发,并简单地使用容器来运行python脚本。

用一个例子来说明这是如何工作的最好方法。为了简单起见,创建一个新文件夹,cd到它,并创建一个简单的python脚本(hello.py):

#!/usr/bin/env python
print("Hello, world!")

现在,我们可以运行以下Docker命令:

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp python:3 python hello.py

该命令将以/usr/src/myapp的形式将当前目录装载到容器中。当您对项目执行此操作时,该目录应该是您的项目目录。该命令将容器中的workdir设置为/usr/src/myapp,这样我们就可以使用相对路径。只需将命令末尾的hello.py更改为要运行的脚本的相对路径。

因为您的项目文件夹是作为卷装载到容器中的,所以您可以在主机上的PyCharm中编辑代码,并在容器中运行脚本。这个例子使用了默认的python 3容器,但用您想要使用的映像的名称替换上面命令中的映像名称很简单,因为您已经安装了所需的依赖项。

最新更新