python在容器内克隆拉取git私有仓库

前言

目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用subprocess调用系统命令,镜像体积也没有想象中增加特别多。

准备ssh私钥和known_hosts文件

应用内通过repo的ssh url克隆和拉取仓库,所以ssh私钥和known_hosts要封装到镜像中。

  1. 生成ssh密钥文件。一般来说提示输入直接回车即可。生成的$HOME/.ssh/id_ed25519为私钥文件,是需要拷贝到镜像中的。$HOME/.ssh/id_ed25519.pub为公钥文件,文件内容需要添加到远程仓库的ssh密钥配置中。
bash 复制代码
ssh-keygen -t ed25519
  1. 准备known_hosts文件,文件内容可以从其它主机拷贝一份。其实ssh密钥文件也可以从其它主机拷贝,只要对应的公钥在git远程仓库的ssh配置中即可。known_hosts文件内容示例。

    gitee.com ssh-ed25519 AxxxxxxxxxxxxxxxxxxxxN

在项目目录中创建一个名为.ssh的目录,然后把id_ed25519和known_hosts文件拷贝到这个目录下,并修改文件权限为600。这个目录待会需要封装到镜像中。

bash 复制代码
chmod 600 id_ed25519 known_hosts

编写python代码

这里只是个demo,拉取私有仓库的代码到本地,然后拷贝出需要的目录或文件。注意代码里面用的都是容器内路径。

python 复制代码
import subprocess
import os
import shutil

repo_url = "git@gitee.com:zhangsan/scout.git"
repo_dir = "/tmp/scout"

def repo_clone():
    cmd = f"git clone --depth=1 --single-branch {repo_url} {repo_dir}"
    if os.path.exists(repo_dir):
        print(f"{repo_dir} has exist")
        return
    runcmd(cmd)

def repo_pull():
    cmd = f"cd {repo_dir};git pull"
    runcmd(cmd)

    if not os.path.exists(f"{repo_dir}/prod"):
        print(f"{repo_dir}/prod is not exist")
        return
    dest_path = "/home/zhangsan/app/prod"
    if not os.path.exists(dest_path):
        os.makedirs(dest_path)
    shutil.copytree(f"{repo_dir}/prod", dest_path, dirs_exist_ok=True)

def runcmd(command):
    ret = subprocess.run(
        command, 
        shell=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        encoding="utf-8",
        timeout=10,
        )
    
    if ret.returncode == 0:
        print("success")
        print(ret.stdout)
    else:
        print(f"fail code: {ret.returncode}")
        print(ret.stdout)

if __name__ == "__main__":
    repo_clone()
    repo_pull()

Dockerfile

目录层级如下

复制代码
.
├── app
│   └── demo.py
├── Dockerfile
└── .ssh
    ├── id_ed25519
    └── known_hosts

编写Dockerfile文件

dockerfile 复制代码
FROM python:3.8-alpine
# 1. 修改apline镜像源
# 2. 安装git和ssh客户端并删除apk缓存
# 3. 创建普通用户及其用户组
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
        && apk add --no-cache git openssh \
        && rm -rf /tmp/* /root/.cache /var/cache/apk/* \
        && addgroup -g 1010 zhangsan \
        && adduser -s /bin/sh -G zhangsan -u 10101 -h /home/zhangsan zhangsan -D

# 将相关文件添加到镜像中
ADD --chown=zhangsan:zhangsan .ssh /home/zhangsan/.ssh
ADD --chown=zhangsan:zhangsan app /home/zhangsan/app

# 指定运行用户, 工作目录和启动命令
USER zhangsan
WORKDIR /home/zhangsan/app
CMD python3 demo.py

打包docker镜像

bash 复制代码
docker build -t pygit:0.0.1 .

测试,创建一个临时容器

bash 复制代码
docker run -it --rm --name pygit pygit:0.0.1 sh

在测试容器内测试能否正常执行

shell 复制代码
python3 demo.py
相关推荐
朝朝辞暮i3 小时前
VLA 系统学习第 4 课:一个 Batch 进入神经网络后,模型到底是怎么“学会”的?
人工智能·python·神经网络·vla
Ada's3 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
2601_962885724 小时前
如何用 Python 计算 TRIX 三重指数平滑均线指标?
开发语言·python
还卿一钵无情泪4 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
ControlRookie4 小时前
SyncBridge:一个 CODESYS 工程与 AI 之间工程师级的同步工具
git·ai编程·codesys·工业软件·controlrookie
蜗牛互联网7 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
statistican_ABin7 小时前
中国国际旅游发展分析报告—基于世界银行国际旅游数据的多维度分析
python·机器学习·旅游
青少儿编程课堂7 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
code2cat7 小时前
【随笔】MCP工具注解的信任边界:四个提示如何参与调用决策
python·ai agent·mcp
慢云智慧空间8 小时前
从设备智能到空间理解,慢云科技如何重新定义智慧建筑
python·科技