前言
目前有個(gè)python應(yīng)用需要在容器鏡像內(nèi)拉取git私有倉(cāng)庫(kù)的代碼,一開始的想法是用GitPython,折騰一番ssh私鑰和known_hosts問(wèn)題后,發(fā)現(xiàn)還是在鏡像中封裝個(gè)git最省事,然后用subprocess調(diào)用系統(tǒng)命令,鏡像體積也沒有想象中增加特別多。
準(zhǔn)備ssh私鑰和known_hosts文件
應(yīng)用內(nèi)通過(guò)repo的ssh url克隆和拉取倉(cāng)庫(kù),所以ssh私鑰和known_hosts要封裝到鏡像中。
- 生成ssh密鑰文件。一般來(lái)說(shuō)提示輸入直接回車即可。生成的
$HOME/.ssh/id_ed25519
為私鑰文件,是需要拷貝到鏡像中的。$HOME/.ssh/id_ed25519.pub
為公鑰文件,文件內(nèi)容需要添加到遠(yuǎn)程倉(cāng)庫(kù)的ssh密鑰配置中。
ssh-keygen -t ed25519
- 準(zhǔn)備known_hosts文件,文件內(nèi)容可以從其它主機(jī)拷貝一份。其實(shí)ssh密鑰文件也可以從其它主機(jī)拷貝,只要對(duì)應(yīng)的公鑰在git遠(yuǎn)程倉(cāng)庫(kù)的ssh配置中即可。known_hosts文件內(nèi)容示例。
gitee.com ssh-ed25519 AxxxxxxxxxxxxxxxxxxxxN
在項(xiàng)目目錄中創(chuàng)建一個(gè)名為.ssh
的目錄,然后把id_ed25519
和known_hosts
文件拷貝到這個(gè)目錄下,并修改文件權(quán)限為600。這個(gè)目錄待會(huì)需要封裝到鏡像中。
chmod 600 id_ed25519 known_hosts
編寫python代碼
這里只是個(gè)demo,拉取私有倉(cāng)庫(kù)的代碼到本地,然后拷貝出需要的目錄或文件。注意代碼里面用的都是容器內(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 .
測(cè)試,創(chuàng)建一個(gè)臨時(shí)容器文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-772330.html
docker run -it --rm --name pygit pygit:0.0.1 sh
在測(cè)試容器內(nèi)測(cè)試能否正常執(zhí)行文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772330.html
python3 demo.py
到了這里,關(guān)于python在容器內(nèi)克隆拉取git私有倉(cāng)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!