繁体   English   中英

使用 docker 开发时运行预提交钩子(例如 pylint)

[英]Running pre-commit hooks (e.g. pylint) when developing with docker

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

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

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

有没有一种很好的方法来运行具有对容器的完全访问权限的预提交?

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

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

注意:在“docker in docker”模式下工作时预提交有点糟糕,所以我们不得不应用一个解决方法,参见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++

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM