Skip to content
赞赏-微信扫码

容器镜像,是分层构建的。不容易变动的层,写到 Dockerfile 的靠前位置。

_

需要一个 Makefile 和 一个 Dockerfile 来构建镜像。

Makefile
.PHONY: build env

VERSION = 1.0.0

build: Dockerfile
	buildctl \
	--addr tcp://buildkitd.cicd.svc.cluster.local:1234 \
	build \
	--frontend dockerfile.v0 \
	--local context=. \
	--local dockerfile=. \
	--output type=image,name=hb.apihub.net/apihub.net/open:$(VERSION),push=true
env:
	pip install -i https://mirrors.apihub.net/repository/pypi/simple -r requirements.txt
Dockerfile
FROM hb.apihub.net/python:3.12-slim-bookworm

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
RUN export LANG="C.UTF-8"

WORKDIR /app

COPY requirements.txt .
RUN pip install -i https://mirrors.apihub.net/repository/pypi/simple -r requirements.txt

COPY . /app

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore
.git/
.gitignore
.vscode/
.idea/
__pycache__/
logs/
Makefile
Dockerfile
README.md

python 项目中,通常会在根路径放一个 requirements.txt

Makefile 里,写了一个 env 指令,可以在空白的开发容器里,快速初始化依赖。

Dockerfile 中有个关键步骤值得说一下。requirements.txt 单独先复制到容器内,然后执行 pip 命令。如果依赖文件里的内容没有改变,pip 命令这一行构建过程是可以被缓存下来的。可以体验到 1秒 构建完的快感,增量拉取的新镜像也只有 python 源码那 几K 文本的大小。