python在容器内克隆拉取git私有仓库
前言
目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用subprocess调用系统命令,镜像体积也没有想象中增加特别多。
准备ssh私钥和known_hosts文件
应用内通过repo的ssh url克隆和拉取仓库,所以ssh私钥和known_hosts要封装到镜像中。
- 生成ssh密钥文件。一般来说提示输入直接回车即可。生成的
$HOME/.ssh/id_ed25519为私钥文件,是需要拷贝到镜像中的。$HOME/.ssh/id_ed25519.pub为公钥文件,文件内容需要添加到远程仓库的ssh密钥配置中。
ssh-keygen -t ed25519
- 准备known_hosts文件,文件内容可以从其它主机拷贝一份。其实ssh密钥文件也可以从其它主机拷贝,只要对应的公钥在git远程仓库的ssh配置中即可。known_hosts文件内容示例。
gitee.com ssh-ed25519 AxxxxxxxxxxxxxxxxxxxxN
在项目目录中创建一个名为.ssh的目录,然后把id_ed25519和known_hosts文件拷贝到这个目录下,并修改文件权限为600。这个目录待会需要封装到镜像中。
chmod 600 id_ed25519 known_hosts
编写python代码
这里只是个demo,拉取私有仓库的代码到本地,然后拷贝出需要的目录或文件。注意代码里面用的都是容器内路径。
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文件
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镜像
docker build -t pygit:0.0.1 .
测试,创建一个临时容器
docker run -it --rm --name pygit pygit:0.0.1 sh
在测试容器内测试能否正常执行
python3 demo.py
python在容器内克隆拉取git私有仓库的更多相关文章
- Jenkins拉取Git远程仓库中指定目录至本地指定目录
Jenkins拉取源码是非常实用的操作,比如每天在跑自动化测试前,拉取Git远程仓库中最新的脚本至本地.那么,Jenkins如何拉取Git远程仓库中指定目录至本地指定目录呢?下面来看看具体的设置方法. ...
- 用控制台命令拉取git最新仓库代码
C#利用Diagnostics 拉取最新代码 示例代码 static void DiagnosticTest() { Process p; ProcessStartInfo psi; psi = ...
- Docker:pipeline编写基本技巧- jenkins配置通过免交互方式拉取git源码管理仓库的代码
工作中,从git仓库拉取代码有2种方式:交互式和非交互式 什么是交互式?就是拉取需要权限才能访问的代码时,需要输入密码 免交互式呢? 是通过密钥,私钥的方式,让服务端信任客户端,产生信任后,任何一次客 ...
- Python 一键拉取Git分支源码自动解析并执行SQL语句
基于Python实现自动拉取Git分支源码自动解析并执行SQL语句 by:授客 QQ:1033553122 1.代码用途 开发过程中,研发人员会提交SQL更新脚本到Git源码库,然后测试负责去拉取这些 ...
- git的使用学习笔记3---关于项目分支创建克隆拉取推送
一.创建项目 1.打开官网 2.填写相关内容 查看新创建的项目 3.选择方式 4.在git上新建文件夹 1)克隆: mkdir workspace 将代码克隆到本地,取本地配置的.ssh的文件 git ...
- Jenkins教程(三)添加凭据与流水线拉取Git代码
前言 本文旨在配置凭据.使用Git仓库中的Jenkinsfile与使用声明式流水线拉取Git代码 使用SVN等其他版本控制工具,请参考使用Pipeline-Syntax生成对应代码块 凭据(crede ...
- git私有仓库与pycharm联合使用
文章目录 1 创建git私有仓库和pycharm的使用 1.1 克隆私有仓库到本地 1.2 使用pycharm打开 1.3 添加.gitignore文件 1.4 并将其添加到仓库 1.5 提交和推送 ...
- 用yunio网盘搭建git私有仓库
研究生开始奔波于教研室和寝室之间,于是想搭建一个git私有仓库来管理自己在做的项目或者学习资料.一来可以很方便的管理项目,二来可以学习使用git.我的主要工作平台是Linux,这也是我选择yuni ...
- Jenkins(3)拉取git仓库代码,执行python自动化脚本
前言 python自动化的脚本开发完成后需提交到git代码仓库,接下来就是用Jenkins拉取代码去构建自动化代码了 新建项目 打开Jenkins新建一个自由风格的项目 源码管理 Repository ...
- idea配置git,查看git代码&拉取git项目至本地
1.点击file,右键选择setting 选择本地git安装路径 Ps:从git上导入一个全新的maven项目 点击clone按钮后,会弹出如下截图弹窗,点击 NO 项目已经拉取到本地,然后点击ope ...
随机推荐
- 熟练掌握并充分利用CSS3的新特性,更新完毕。
1.1 尝试新颖的CSS3特性 首先,我们来看一个具体的案例. https://code.juejin.cn/pen/7277536985772720139 1.2 CSS3新特性简介和浏览 ...
- 其它——MyCat实现分库分表
文章目录 MyCat实现分库分表 一 开源数据库中间件-MyCat 二 MyCat简介 三 MyCat下载及安装 3.1 MySQL安装与启动 3.2使用docker启动多个数据库 3.3 MyCat ...
- Vocabulary
词汇(Vocabulary) blackmail ( n.) :the obtaining of money or advancement by threatening to make known u ...
- 如何将linux设置成网关
如何将linux设置成网关 打开网关linux的端口转发功能:echo '1' > /proc/sys/net/ipv4/ip_forward 在VMWare中创建一个仅主机的内网: 进入本机配 ...
- 分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文的内容主要围绕以下几个部分: TCP/IP的简单介绍. 消息的介绍 ...
- 在Finalshell中一直弹出弹窗要求输入密码的解决方案
在finalshell中即使输入正确了密码,仍然要求输入(密码错误), 对CentOS的防火墙也已经关闭,但是仍然提示 这个原因是因为自创的用户名在finalshell中不被认可,需要将用户名更改为r ...
- P8815 [CSP-J 2022] 逻辑表达式
Problem 考察算法:后缀表达式计算.建表达式树.\(DFS\). 题目简述 给你一个中缀表达式,其中只有 \(\&\) 和 \(\mid\) 两种运算. 求:\(\&\) 和 \ ...
- python 自动创建Hype-V虚拟机脚本
安装模块 pip install pywinrm 脚本如下 #!/usr/bin/env python3 # coding=utf-8 # author:LJX # describe:一键创建hype ...
- OI 学习笔记 I:图论(更新中)
阅读时建议在右下角开启目录. 由于作者的数学水平限制和篇幅限制,有些结论可能仅给出感性理解或不给出证明,有疑惑的读者可以百度答案或者前往参考资料一栏查找. 另外,因为图论的内容比较杂,有些与树相关的算 ...
- 彻底搞懂CAP理论(电商系统)
1.理解CAP CAP是 Consistency.Availability.Partition tolerance三个词语的缩写,分别表示一致性.可用性.分区容忍性. 下边我们分别来解释: 为了方便对 ...