python在容器内克隆拉取git私有仓库,准备ssh私钥和kn
python在容器内克隆拉取git私有仓库,准备ssh私钥和kn
前言
目前有个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
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/17941013
相关内容
- 【Python】【OpenCV】OCR识别(一),首先先对图像进行预
- Python笔记二之多线程,注意:以下的操作都是
- python3发送Gratuitous ARP更新vip绑定关系,今天记录下pyt
- Python趣味入门12:初遇类与实例,1、类一提到类大神们
- 一键打包,随时运行,Python3项目虚拟环境一键整合包的制
- Python趣味入门13:类中的各种变量,但是在不同的位置定
- Python教程(19)——python异常处理,当出现异常时,程序无
- Python 装饰器,且看以下案例:def
- Python趣味入门14:类的继承,类似于COVID-1
- Python 学习笔记(十六)--Django REST Framework之serializers,
评论关闭