如何使用 Docker 容器作为从我的 IDE 运行 Python 测试的 virtualenv?

Alv*_*nti 4 python tdd pycharm docker visual-studio-code

不要误会我的意思,virtualenv(或 pyenv)是一个很棒的工具,虚拟环境的整个概念是对开发人员环境的巨大改进,减轻了整个Snowflake Server反模式。

但是现在 Docker 容器无处不在(有充分的理由),让您的应用程序在容器上运行但同时在 IDE 中设置本地虚拟环境以运行测试等感觉很奇怪。

我想知道是否有办法利用 Docker 容器来实现这个目的?

Alv*_*nti 7

概括

是的,有一种方法可以实现这一目标。通过配置远程 Python 解释器和“sidecar”Docker 容器。

这个 Docker 容器将具有:

  • 安装到源代码的卷(以下称为 /code)
  • SSH 设置
  • 为 root:password 凭证启用了 SSH,并且允许 root 用户登录

准备好 sidecar 容器

这里的想法是复制应用程序的容器并为其添加 SSH 功能。我们将使用docker-compose来实现这一点:

docker-compose.yml:

version: '3.3'

services:
  dev:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - 127.0.0.1:9922:22
    volumes:
      - .:/code/
    environment:
      DEV: 'True'
    env_file: local.env
Run Code Online (Sandbox Code Playgroud)

Dockerfile.dev

FROM python:3.7
ENV PYTHONUNBUFFERED 1

WORKDIR /code

# Copying the requirements, this is needed because at this point the volume isn't mounted yet
COPY requirements.txt /code/

# Installing requirements, if you don't use this, you should.
# More info: https://pip.pypa.io/en/stable/user_guide/
RUN pip install -r requirements.txt

# Similar to the above, but with just the development-specific requirements
COPY requirements-dev.txt /code/
RUN pip install -r requirements-dev.txt

# Setup SSH with secure root login
RUN apt-get update \
 && apt-get install -y openssh-server netcat \
 && mkdir /var/run/sshd \
 && echo 'root:password' | chpasswd \
 && sed -i 's/\#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Run Code Online (Sandbox Code Playgroud)

设置 PyCharm 专业版

  1. 首选项 (CMD + ,) > 项目设置 > 项目解释器
  2. 单击“项目解释器”下拉菜单旁边的齿轮图标 > 添加
  3. 选择“SSH Interpreter”> Host: localhost, Port: 9922, Username: root > Password: password > Interpreter: /usr/local/bin/python, Sync folders: Project Root -> /code, Disable“Automatically upload... ”
  4. 确认更改并等待 PyCharm 更新索引

设置 Visual Studio 代码

  1. 安装Python扩展
  2. 安装远程 - 容器扩展
  3. 打开命令面板并输入 Remote-Containers,然后选择 Attach to Running Container... 并选择正在运行的 docker 容器 VS Code 将重新启动并重新加载
  4. 在资源管理器侧栏上,单击打开文件夹按钮,然后输入 /code(这将从远程容器加载)
  5. 在扩展侧栏上,选择 Python 扩展并将其安装在容器上
  6. 当提示使用哪个解释器时,选择 /usr/local/bin/python
  7. 打开命令面板并输入 Python: Configure Tests,然后选择 unittest 框架

TDD 支持

现在您可以直接从您的 IDE 运行您的测试,使用它来尝试测试驱动开发!它的关键点之一是快速反馈循环,不必等待完整的测试套件完成执行就可以查看您的新测试是否通过,这很棒!只需编写并立即运行它!

参考

这个答案的内容也可以在这个GIST 中找到