使用 pip 安装位于 Git 代码仓库中的软件包

2023-12-02#Python#Docker

在开发 Python 应用时,使用pip安装第三方软件包。默认从官方的 PyPI(Python Package Index)安装。企业可能会搭建自己的PyPI服务器,托管内部的 Python 包;但实际中,企业可能还未搭建这样的服务器。在这种情况下,其实可以使用pip直接安装位于 Git 代码库中的 Python包。

从Git仓库中安装软件包 🔗

pip 的官方文档 介绍了它对版本控制系统的支持。它目前支持Git、Mercurial、Subversion和Bazaar。对于Git仓库而言,推荐的方式是使用git+httpsgit+ssh,比如以下形式:

git+ssh://git@git.example.localdomain/MyProject
git+file:///home/user/projects/MyProject
git+https://git.example.localdomain/MyProject

甚至可以指定分支或者标签:

git+ssh://git@git.example.localdomain/MyProject@v0.1.0
git+file:///home/user/projects/MyProject@v0.1.0
git+https://git.example.localdomain/MyProject@v0.1.0

在使用时,将其作为pip install参数或requirements.txt文件的一行即可。

构建使用私有软件包的 Docker 镜像 🔗

在实际中,常常使用Docker发布软件,在构建镜像时安装软件包。如果软件包是公开的,那么不需要特殊设置。但如果所在的代码仓库是私有的,那么就得让构建进程能够访问代码库。假设使用git-ssh安装软件包,那么将SSH密钥写入Dockerfile,或者通过ARG传给构建进程都是有安全隐患的。

好消息是,可以将SSH Key转发给Docker构建进程,然后就可以访问私有的代码仓库了,可参考官方说明 SSH agent socket or keys to expose to the build (--ssh)

以下是简单场景下的主要步骤.

更新 Dockerfile 挂载 SSH 🔗

Dockerfile 中的核心片段如下:

# download public key for the host
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan git.example.localdomain >> ~/.ssh/known_hosts

# install the package from git repo
RUN --mount=type=ssh pip install git+ssh://git@git.example.localdomain/MyProject@v0.1.0

在构建镜像时转发 SSH Key 🔗

在构建时候,添加-ssh选项:

eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
docker build --ssh default . # or docker build --ssh default=$SSH_AUTH_SOCK .

在Github Actions上构建镜像 🔗

在 Github Actions 构建镜像时,首先需要将SSH Key加入到 Secrets 中,然后在 Workflow 中设置设置 SSH 转发。可利用现有的 webfactory/ssh-agent 进行设置,然后即可构建镜像:

build:
    stpes:
      - uses: webfactory/ssh-agent@v0.7.0
        with:
          ssh-private-key: ${{ secrets.SVC_SSH_KEY }}
      - run: docker build --ssh default .

在 Jenkins 中构建镜像 🔗

首先在Jenkins管理控制台配置一个新的Credentials,假定叫做git-ssh-key,然后配置Jenkinsfile:

pipeline {
    agent any

    stages {
        stage('Build Docker Image') {
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: "git-ssh-key", keyFileVariable: "GIT_SSH_KEY")]) {
                    sh "eval \"\$(ssh-agent -s)\" && ssh-add \${GIT_SSH_KEY}"
                    sh "docker build --ssh default ."
                }
            }
        }
    }
}

在构建镜像时使用多个SSH Key 🔗

在真实情况中,可能出现访问多个不同的代码仓库,并使用不用的SSH Key的情况。此时,docker build-ssh 的值就不能是default,而是一个 id。具体可参考这篇文章Build secrets and SSH forwarding in Docker 18.09

其他方法:使用secrets 🔗

除了挂载SSH之外,还可以挂载secrets,在构建镜像时挂载SSH密钥。其用法与挂载SSH类似,仍然可参考这篇文章 Build secrets and SSH forwarding in Docker 18.09


加载中...