如何为Docker镜像打上与Python生成的Dockerfile中version标签一致的版本标签
问题描述
我通过Python脚本生成Dockerfile,将项目的__version__值写入Dockerfile的version标签,代码如下:
from src.mypackage import __version__ docker = """FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim LABEL version="{}" ENV ... COPY ... RUN... """.format(__version__) with open('Dockerfile', 'w') as writer: writer.write(docker)
现在我希望在执行docker build构建镜像时,为镜像打上与该version标签值相同的版本标签(例如执行类似docker build -f docker\Dockerfile -t myproject:<version> .的命令),请问有什么可行的实现方法?
可行实现方法
方法1:从Python脚本直接获取版本号,构建时引用
修改你的Python生成脚本,在输出Dockerfile的同时,把版本号打印到标准输出:
from src.mypackage import __version__ docker = """FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim LABEL version="{}" ENV ... COPY ... RUN... """.format(__version__) with open('Dockerfile', 'w') as writer: writer.write(docker) # 新增:打印版本号到标准输出 print(__version__)
然后执行构建时,直接捕获脚本输出的版本号:
VERSION=$(python your_script.py) && docker build -t myproject:$VERSION .
如果脚本路径在docker目录下,调整命令为:
VERSION=$(python docker/your_script.py) && docker build -f docker/Dockerfile -t myproject:$VERSION .
方法2:从生成的Dockerfile中提取版本号
不需要修改Python脚本,直接用命令行工具从已生成的Dockerfile中提取LABEL version的值:
VERSION=$(grep -oP 'LABEL version="\K[^"]+' docker/Dockerfile) && docker build -f docker/Dockerfile -t myproject:$VERSION .
解释:grep -oP使用Perl正则表达式,\K会忽略前面匹配的内容,只提取双引号内的版本号字符串。
方法3:在Python脚本中直接调用Docker构建命令
如果希望一步完成Dockerfile生成和镜像构建,可以在Python脚本末尾添加subprocess调用,直接执行docker build命令:
from src.mypackage import __version__ import subprocess docker = """FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim LABEL version="{}" ENV ... COPY ... RUN... """.format(__version__) with open('docker/Dockerfile', 'w') as writer: writer.write(docker) # 直接执行docker build命令 subprocess.run( ["docker", "build", "-f", "docker/Dockerfile", "-t", f"myproject:{__version__}", "."], check=True # 构建失败时抛出异常 )
执行这个脚本就会自动完成Dockerfile生成和带版本标签的镜像构建。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

