需求
1、使用Docker构建一个python容器,用于运行python相关应用
2、基于Dockerfile构建python容器
3、镜像的体积需要尽量的小(OS和python采用最小化安装)
Python版本:3.8.13
OS版本:Debian GNU/Linux 11 \n \l
解决方案
编写Dockerfile
这里是基于python:3.8.13-slim构建的镜像,需要切换版本可以在Docker Hub中查看
python Tags | Docker Hub
需要特别注意的地方:
-
不同的python的版本大小都不相同,例如有:slim-bullseye、slim、bullseye、buster、slim-buster等等的版本,每个版本的镜像大小不相同,包含的python库、工具也有所区别,例如下面从Docker Hub截图的python tag的完整python镜像和slim镜像大小差距将近300MB,各版本大致含义各位可以参考文末的补充内容。
话不多说,开始编写Dockerfile
vi Dockerfile
FROM python:3.8.13-slim
USER root
ENV TZ=UTC
RUN echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free' > /etc/apt/sources.list && \
echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free' >> /etc/apt/sources.list && \
echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free' >> /etc/apt/sources.list && \
echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free' >> /etc/apt/sources.list && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
apt update && \
apt install -y iptables iproute2 procps
COPY ./demo-python /opt/demo-python/
WORKDIR /opt/demo-python
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ENTRYPOINT [ "/opt/demo-python/docker-entrypoint.sh" ]
代码解释:
1、上述内容中RUN由多条命令组合而成:
- python:3.8.13-slim是基于Debian的,我们首先需要配置apt源为清华的镜像源
- 配置镜像的时区
- apt检查更新软件列表(不会实际更新软件)
-
通过apt安装项目中需要使用到的软件组件
(我这里使用到了iptables、iproute、ps相关命令,因此安装,各位可以根据实际项目情况选择需要安装的组件)
2、将python的程序包复制到镜像指定目录中,并指定工作目录
3、通过pip安装python程序中所需的依赖
4、配置镜像的切入点(我这里的切入点是一个sh程序,内容如下所示,sh中含有其他的具体命令,我这里就省略了,各位可以自行根据项目编写,如果没有额外的处理逻辑,可以不配置具体的切入点,直接通过Dockerfile CMD启动python)
#!/bin/bash
# 额外的代码逻辑略
# main.
echo '#~ demo-python starting...'
python bin/app.py
至此Dockerfile就编写完成了,在Dockerfile和demo-python的同级目录下执行:
> docker build -t demo-python:1.0.0 .
Tips:
注意命令最后有一个点,代表当前路径(具体docker build目录,Dockerfile构建可以自行查看相关资料)
编写Docker Compose
vi docker-compose.yml
version: '1.0.0'
services:
sinkhole:
container_name: demo-python
image: demo-python:1.0.0
restart: unless-stopped
privileged: true
volumes:
- /opt/demo-python/config:/opt/demo-python/config
- /opt/demo-python/logs:/opt/demo-python/logs
cap_add:
- ALL
stdin_open: true
tty: true
healthcheck:
test: ["CMD", "ps -ef|grep demo-python |grep -v grep |grep -v 'vi ' |grep -v 'vim ' |wc -l"]
interval: 1m
timeout: 3s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 10s # 启动后,多少秒开始启动检测程序
代码解释:
1、image指向通过Dockerfile构建的镜像
2、privileged 指容器使用root权限
3、cap_add 添加或删除容器拥有的宿主机的内核功能。配置ALL指开启全部权限
4、stdin_open、tty相当于docker run -it
5、healthcheck 用于检测 docker 服务是否健康运行
然后在docker-compose.yml同级目录下执行:
> docker-compose up -d
即可完成容器的创建和运行。