日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2024/1/2 python 56 coder
生活随笔 收集整理的這篇文章主要介紹了 python在容器内克隆拉取git私有仓库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

目前有個(gè)python應(yīng)用需要在容器鏡像內(nèi)拉取git私有倉庫的代碼,一開始的想法是用GitPython,折騰一番ssh私鑰和known_hosts問題后,發(fā)現(xiàn)還是在鏡像中封裝個(gè)git最省事,然后用subprocess調(diào)用系統(tǒng)命令,鏡像體積也沒有想象中增加特別多。

準(zhǔn)備ssh私鑰和known_hosts文件

應(yīng)用內(nèi)通過repo的ssh url克隆和拉取倉庫,所以ssh私鑰和known_hosts要封裝到鏡像中。

  1. 生成ssh密鑰文件。一般來說提示輸入直接回車即可。生成的$HOME/.ssh/id_ed25519為私鑰文件,是需要拷貝到鏡像中的。$HOME/.ssh/id_ed25519.pub為公鑰文件,文件內(nèi)容需要添加到遠(yuǎn)程倉庫的ssh密鑰配置中。
ssh-keygen -t ed25519
  1. 準(zhǔn)備known_hosts文件,文件內(nèi)容可以從其它主機(jī)拷貝一份。其實(shí)ssh密鑰文件也可以從其它主機(jī)拷貝,只要對(duì)應(yīng)的公鑰在git遠(yuǎn)程倉庫的ssh配置中即可。known_hosts文件內(nèi)容示例。
gitee.com ssh-ed25519 AxxxxxxxxxxxxxxxxxxxxN

在項(xiàng)目目錄中創(chuàng)建一個(gè)名為.ssh的目錄,然后把id_ed25519known_hosts文件拷貝到這個(gè)目錄下,并修改文件權(quán)限為600。這個(gè)目錄待會(huì)需要封裝到鏡像中。

chmod 600 id_ed25519 known_hosts

編寫python代碼

這里只是個(gè)demo,拉取私有倉庫的代碼到本地,然后拷貝出需要的目錄或文件。注意代碼里面用的都是容器內(nèi)路徑。

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

目錄層級(jí)如下

.
├── app
│?? └── demo.py
├── Dockerfile
└── .ssh
    ├── id_ed25519
    └── known_hosts

編寫Dockerfile文件

FROM python:3.8-alpine
# 1. 修改apline鏡像源
# 2. 安裝git和ssh客戶端并刪除apk緩存
# 3. 創(chuàng)建普通用戶及其用戶組
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

# 將相關(guān)文件添加到鏡像中
ADD --chown=zhangsan:zhangsan .ssh /home/zhangsan/.ssh
ADD --chown=zhangsan:zhangsan app /home/zhangsan/app

# 指定運(yùn)行用戶, 工作目錄和啟動(dòng)命令
USER zhangsan
WORKDIR /home/zhangsan/app
CMD python3 demo.py

打包docker鏡像

docker build -t pygit:0.0.1 .

測試,創(chuàng)建一個(gè)臨時(shí)容器

docker run -it --rm --name pygit pygit:0.0.1 sh

在測試容器內(nèi)測試能否正常執(zhí)行

python3 demo.py

總結(jié)

以上是生活随笔為你收集整理的python在容器内克隆拉取git私有仓库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。