使用 pip 安装位于 Git 代码仓库中的软件包
在开发 Python 应用时,使用pip
安装第三方软件包。默认从官方的 PyPI(Python Package Index)安装。企业可能会搭建自己的PyPI服务器,托管内部的 Python 包;但实际中,企业可能还未搭建这样的服务器。在这种情况下,其实可以使用pip
直接安装位于 Git 代码库中的 Python包。
从Git仓库中安装软件包 🔗
pip 的官方文档 介绍了它对版本控制系统的支持。它目前支持Git、Mercurial、Subversion和Bazaar。对于Git仓库而言,推荐的方式是使用git+https
和git+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 。