【问题标题】:Running pre-commit hooks (e.g. pylint) when developing with docker使用 docker 开发时运行预提交挂钩(例如 pylint)
【发布时间】:2020-01-16 16:09:27
【问题描述】:

预提交挂钩在单独的虚拟环境(或 Docker 容器)中运行。然而,我们的代码在 Docker 上运行,我们也在使用 Docker 进行开发。

到目前为止,我们不必在主机系统上安装任何依赖项,但是在运行 mypyisortpylint 时,它们会遇到问题,因为它们无法访问已安装的依赖项。

我们的第一个想法是在主机系统的虚拟环境中安装依赖项,但是 这似乎也是一个笨拙的解决方法。

有没有一种好方法可以在完全访问容器的情况下运行预提交?

【问题讨论】:

    标签: python python-3.x docker pylint pre-commit


    【解决方案1】:

    我们有同样的想法,这就是我们团队的最终结果:

    • 预提交 Docker 映像。基于 docker 的简单、最小的 Docker 映像,仅包含 pre-commit 本身(隐式包含 pythonpip 等)。 注意:这里确实需要docker 图像,因为我们确实使用了基于 Docker 的钩子。
    • 包含“复杂”钩子/检查器的独立 Docker 映像集。 “复杂”是指那些需要一些构建时依赖项、编译器、额外库等的东西,这些东西不能用简单的“pip install”安装在干净的机器上。一个例子是clang-format,我们从源代码构建,所以最终的clang-format Docker 镜像只包含clang-format 二进制文件。这就是mypy 可能会去的地方,因为它有很多额外的非 Python 依赖项。

    注意:在“docker in docker”模式下工作时,pre-commit 有点糟糕,所以我们必须应用一个解决方法,请参阅https://github.com/pre-commit/pre-commit/issues/1387

    最后,我们的.pre-commit-config.yaml 文件包含如下条目:

    # Normal, "simple" hooks which can be just installed as is
    - repo: ...pre-commit-hooks/pre-commit-hooks
      rev: v3.3.0
      hooks:
       - ...
    
    # Docker hooks
    - repo: local
      hooks:
      - id: docker-clang-format
        name: Docker Clang Format
        language: docker_image
        types:
        - c++
        entry: <our-registry.com>/clang_format:11
    
    # Local workarounds for devs who cannot or don't want to use Docker, but still would like to benefit from running pre-commit locally
    - repo: <...>/pre-commit-clang-format
        rev: ...
        hooks:
          - id: clang-format
            stages: [manual]  # Mind this line, only for manual run
            types:
              - c++
    

    【讨论】:

      【解决方案2】:

      为代码样式检查创建一个特殊的容器怎么样?

      它应该安装了所有需要的 linter 和一个 bash 文件来检查代码目录。

      你的钩子命令看起来像docker run -v [mount code dir to container in RO mode] codestyle_check_container

      【讨论】:

      • 我不确定我是否正确理解了您的解决方案。这是否意味着(如果我想继续使用 pre-commit 的功能)我需要在主机系统上安装 pre-commit 并将其设置为运行一个单独设置所有依赖项的 docker-container (以及实际安装的回购)?我认为它可以工作,但请记住,尽管预提交确实隐藏了任何未暂存的更改。不过,这似乎不是很简单。
      • @Jann 假设,您理解正确。如果您想在容器内运行 pre-commit,您可以让您的容器访问主机系统的 docker 守护进程,因此容器内的docker run 将调用主机系统的 docker(在生产中永远不要这样做)。 stackoverflow.com/questions/48152736/… 。所以你有带有代码的 docker 卷,你在你的容器中运行 pre-commit 钩子,它启动另一个容器,它检查你的代码。(使用主机系统的 docker 守护进程)
      • 您拥有的代码检查越多,您的图像就越大(并且可重用性越低!):) 所以最好从一开始就将关注点分开,当有一天您有两个问题时也会有所帮助检查器需要不同版本的东西。
      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2011-03-20
      • 2020-02-15
      • 2014-01-03
      • 1970-01-01
      • 2021-02-10
      • 2021-09-10
      相关资源
      最近更新 更多