python在容器内克隆拉取git私有仓库
生活随笔
收集整理的這篇文章主要介紹了
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私有仓库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看笔记本电脑电池报告(当前电池损耗度)
- 下一篇: 内蒙穷小子摆摊创业,二十年狂赚25亿,为