docker构建python3容器、压缩python镜像大小

  • Post author:
  • Post category:python


需求

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

需要特别注意的地方:

  1. 不同的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由多条命令组合而成:

  1. python:3.8.13-slim是基于Debian的,我们首先需要配置apt源为清华的镜像源
  2. 配置镜像的时区
  3. apt检查更新软件列表(不会实际更新软件)
  4. 通过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

即可完成容器的创建和运行。



版权声明:本文为qq_32352777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。