Docker定制化Python基础镜像

1、选择基础镜像的难题

在使用Docker部署某类服务时,第一个面临的问题就是选择一个基础镜像。那么如何选择基础镜像更有利于我们的工作呢?

我们知道docker是基于linux的,任何一个镜像,其包含的 bins/libs/files 都可以认为是属于特定linux版本的一部分。linux一切皆文件的思想下,我们在使用docker制作服务镜像部署时,包管理、环境设置、程序安装、命令格式、文件系统、兼容性等对于不同linux版本都可能有一些区别,所以,选择一个习惯使用的linux版本就变得尤为重要。

举例来说,我需要经常用docker部署Python应用。在docker hub中选择哪个基础镜像呢?搜索“适合Python开发的Docker镜像”会有很多文章,常用的主要有Alpine、Stretch、Jessie等,默认版本是基于Ubuntu的,但是太大了。

Alpine是一个微型linux系统,选择这个版本镜像的很多,因为它足够小,但是实际项目使用时却发现各种各样的问题。最大问题就是它的c运行库采用 musl-libc 而不是linux各发行版的 glibc,所以涉及c运行时会有兼容性的问题。

2、定制基础镜像

在选择基础镜像的问题上踩坑无数之后,决定换个角度想:为什么不基于特定的linux版本,自己制作一个基础镜像呢?这样自己又熟悉,又有开发环境来验证问题,而且很多制作应用镜像时遇到的问题,都可以在定制的基础镜像中一次性解决。

从这个想法出发,我选择熟悉的linux版本基础镜像,然后在其中按需求安装Python环境,一切都跟在服务器上安装Python环境一样,这不就又回到了熟悉的操作了吗?不同的是,这些只需要做一次就可以了,得到自己定制的Python基础镜像,后面制作各种应用镜像时,只需要pip安装依赖库、复制文件、添加命令就可以了。

这个方法同样适用其他的环境基础镜像定制,选择自己的linux基础镜像,在其中像往常一样安装需要的环境。这样,就可以从镜像里不熟悉的文件系统中解脱出来了。

3、定制CentOS系统Python基础镜像

下面给出一个实例:

开发环境:CentOS 7

Python版本:3.6

# 完整功能python3 imiyuer/python:3.6.4-centos
FROM centos:7.5.1804
MAINTAINER imiyuer <imiyuer@qq.com>

ENV PATH $PATH:/usr/local/python3/bin/
ENV PYTHONIOENCODING utf-8

RUN set -ex \
	# 替换yum源
	&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \ 
	&& curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
	&& sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \	
	# 安装python依赖库
	&& yum makecache \
	&& yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \
	&& yum clean all \
	&& rm -rf /var/cache/yum \
	# 下载安装python3
	&& wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz \
	&& mkdir -p /usr/local/python3 \
	&& tar -zxvf Python-3.6.4.tgz \
	&& cd Python-3.6.4 \
	&& ./configure --prefix=/usr/local/python3 \
	&& make && make install && make clean \
	# 修改pip默认镜像源
	&& mkdir -p ~/.pip \
	&& echo '[global]' > ~/.pip/pip.conf \
	&& echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf \
	&& echo 'trusted-host = pypi.tuna.tsinghua.edu.cn' >> ~/.pip/pip.conf \
	&& echo 'timeout = 120' >> ~/.pip/pip.conf \
	# 更新pip
	&& pip3 install --upgrade pip \
	# 安装wheel
	&& pip3 install wheel \
	# 删除安装包
	&& cd .. \
	&& rm -rf /Python* \
	&& find / -name "*.py[co]" -exec rm '{}' ';' \
	# 设置系统时区
	&& rm -rf /etc/localtime \
	&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

比如我的生产环境是centos:7.5.1804,就选择它作为基础镜像。

将Python安装在/usr/local/python3,所以把程序路径添加到PATH环境变量,后续安装的python程序就不需要再添加环境变量或软连接。添加Python的encoding环境变量为utf-8。

后面下载安装Python的过程就都比较熟悉了,玩过Python的人都知道。

最终生成镜像大小:453MB,感觉还好。alpine镜像是90M但是很坑,默认python镜像是689MB。

几点说明:

1、RUN中尽量使用 \ &&连接命令的方式,减少镜像层数,可以一定程度减少体积。

2、尽可能删除不需要的文件,也是为了减少镜像体积。

3、Python默认不安装wheel,但是第三方库常需要使用wheel安装,所以加上它。

4、docker运行时程序获取系统时间时,如打印日志等,获取的是docker镜像内文件系统的时区设置,默认是格林尼治标准时区,所以需要设置为所在的时区。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Ubuntu、PythonDocker 都是非常流行的技术栈组件,在软件开发中有着广泛的应用。如果你想在一个 Docker 容器中运行基于 Ubuntu 的 Python 应用,首先你需要做的就是下载对应的 Docker 镜像。 1. **Docker 镜像基础**:Docker 提供了一个庞大的官方仓库(Docker Hub),其中包含了各种预构建的基础镜像,如 Ubuntu 的官方镜像(`ubuntu`)和 Python基础镜像(例如 `python:latest`, `python:3.x` 等)。你可以通过命令行访问这些镜像。 示例: ``` docker pull ubuntu # 下载最新版的 Ubuntu 镜像 docker pull python # 或者下载 Python 镜像 ``` 2. **安装 Python**:如果你需要的是包含 Python镜像,可以直接拉取,因为很多基础镜像已经预装了不同版本的 Python。如果镜像中没有安装特定版本的 Python,可以在容器启动时或 Dockerfile 中添加安装步骤。 3. **自定义镜像**:如果你想要创建一个定制镜像,可以从官方镜像开始,并添加额外的 Python 包或其他配置。可以通过 Dockerfile 来定义这个过程,文件里会列出一系列命令来安装所需软件。 ```dockerfile # 使用官方的 Ubuntu 基础镜像 FROM ubuntu # 更新系统并安装 Python RUN apt-get update && apt-get install -y python3 # 添加你的 Python 库或代码 COPY your_python_code /app # 设置环境变量等其他配置 CMD ["python", "/app/main.py"] ``` 然后,运行 `docker build -t my-python-app .` 来构建你的镜像
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值