前言
「笔记」和「操作手册」应该怎么区分呢?
正文
有一些使用 Github Actions 跑 Python 的项目,其中一种方案是使用 Docker + pipenv,后者是 Python 的包管理工具,类似于 npm;
本文将记录如何在自建 Linux 环境使用该方案……
1 2 3 4 5 6 7
| GIT_PATH=~/Git git clone [email protected]:VaultVulp/action-pipenv.git $GIT_PATH/action-pipenv
cd $GIT_PATH/action-pipenv docker build -t py-pipenv .
|
· 执行 mkdir -p ~/test/py-pipenv
创建测试目录,然后在该目录下创建main.py
文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| import json import feedparser import pprint
rss_list = feedparser.parse('https://www.wdssmq.com/feed.php')
rlt_list = [{'title': entry['title'], 'link':entry['link']} for entry in rss_list['entries']]
pprint.pprint(rlt_list)
with open('output.json', 'w') as f: json.dump(rlt_list, f)
|
· 在该目录下创建Pipfile
文件,内容如下:
1 2 3 4 5 6 7 8 9 10
| [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi"
[scripts] main = "python main.py"
[packages] feedparser = "*"
|
1 2 3 4 5 6 7 8 9 10
| PY_DIR=~/test/py-pipenv ENVS_DIR=${PY_DIR}/virtualenvs docker run --name py-run \ --rm \ --workdir /app \ -v ${PY_DIR}:/app \ -v ${ENVS_DIR}/:/root/.local/share/virtualenvs \ py-pipenv \ "install -d"
|
· 在${PY_DIR}
内会生成virtualenvs
目录,其中包含了虚拟环境的相关文件,在 Pipfile 内依赖项不变的情况下只需要执行一次构建;
1 2 3 4 5 6 7 8 9 10
| PY_DIR=~/test/py-pipenv ENVS_DIR=${PY_DIR}/virtualenvs docker run --name py-run \ --rm \ --workdir /app \ -v ${PY_DIR}:/app \ -v ${ENVS_DIR}/:/root/.local/share/virtualenvs \ py-pipenv \ "run main"
|
· 相当于执行了pipenv run main
,在${PY_DIR}
内会生成output.json
文件;
补充
--rm
参数表示运行完毕后自动删除容器;
--workdir
指定工作目录;
-v
挂载目录到容器内;
py-pipenv
是前边构建镜像指定的名称;
"install -d"
或 "run main"
将作为参数传递给容器内的 pipenv
命令;
相关链接
「小事」Python 的 Docker 镜像更新了一波_杂七杂八_沉冰浮水:
https://www.wdssmq.com/post/20210820542.html
VaultVulp/action-pipenv: Use pipenv commands in your GitHub Actions Workflow:
https://github.com/VaultVulp/action-pipenv