制作Python3的docker镜像

目录

选择基础镜像

在容器内安装Python3

进入容器内部

安装必要的工具

安装Python

验证

制作镜像

常见问题

1. 为什么不将python3命令配置成python

2. 将镜像打包


这是一篇制作docker镜像的blog。镜像里安装Python3和pip工具。下面分步介绍制作方法,仅供参考。如果有出错的地方欢迎留言讨论。

选择基础镜像

选择一个合适的镜像去安装python3等工具至关重要。在这里我选择了CentOS7镜像作为基础镜像。喜欢Ubuntu或者其他镜像的小伙伴可以自己下载尝试。下面的命令将CentOS7镜像下载到本地:

docker pull centos:7.4.1708

?提示:如果下载centos镜像速度过慢,可以尝试更换镜像源。更换镜像源的方法这里不再介绍,需要的小伙伴可以自己搜索。

下载完毕,我们使用docker images可以看到刚刚下载的镜像:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.4.1708            9f266d35e02c        21 months ago       197MB

在容器内安装Python3

进入容器内部

为了在容器内部安装Python3,我们首先需要运行容器:

$ docker run -itd centos:7.4.1708
5fec2f8eaf3b1d000548c5ddb8c259e21fe03ac9e086fcf7f9b1e1945f2bbcf0
$ docker exec -it 5fec2f8eaf3b1d000548c5d /bin/bash
[root@5fec2f8eaf3b /]#

?提示:

docker run -itd centos:7.4.1708 命令将启动一个容器。这条命令会回显出启动容器的id(即上面的5fec2f8eaf3b1d000548c5ddb8c259e21fe03ac9e086fcf7f9b1e1945f2bbcf0)。

docker exec -it 5fec2f8eaf3b1d000548c5d /bin/bash 命令会进入到容器内部。容器id只需要从开头写出一部分即可,不需要全部写全。

看到 命令提示符变为[root@28bfc117484b /]# 后,我们就进入到了容器内部中。可以使用hostname命令测试验证一下是不是在容器内部:

[root@5fec2f8eaf3b /]# hostname
5fec2f8eaf3b

主机名变成了容器id开头的部分子字符串。说明我们已经处于容器中了。接下来的流程就好比在一台CentOS7服务器上安装Python3一样简单。

安装必要的工具

我们下载的镜像是一个纯净的CentOS,很多基础的工具需要我们手动安装。

首先需要更新下yum:

yum update -y

接下来安装我们需要的工具:

yum install -y zlib-devel
yum install -y bzip2-devel
yum install -y openssl-devel
yum install -y ncurses-devel
yum install -y sqlite-devel
yum install -y readline-devel
yum install -y tk-devel
yum install -y libffi-devel
yum install -y wget 
yum install -y gcc
yum install -y make

安装Python

我在这里演示使用的是python3.9.0,大家根据自己的需求安装对应的版本。

首先创建安装路径:

mkdir -p /usr/local/python/python3

进入到/usr/local目录中,下载python源码。

cd /usr/local
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

下载成功后解压:

tar -zxvf Python-3.9.0.tgz

进入到解压后的目录,编译安装环境,安装Python。

cd Python-3.9.0/
./configure --prefix=/usr/local/python/python3
make && make install

创建软链接

ln -s /usr/local/python/python3/bin/python3.9 /usr/bin/python3
ln -s /usr/local/python/python3/bin/pip3 /usr/bin/pip3

升级pip3

pip3 install --upgrade pip

验证

[root@5fec2f8eaf3b bin]# pip3 --version
pip 20.3.1 from /usr/local/python/python3/lib/python3.9/site-packages/pip (python 3.9)
[root@5fec2f8eaf3b bin]# python3 --version
Python 3.9.0

制作镜像

安装好Python以及所需的工具包后,我们可以把当前的容器制作成自己的镜像。我们在容器外部执行docker commit来制作镜像。我们将新的镜像命名为python3,标签定为3.9.0,表示该镜像安装的python版本是3.9.0。

$ docker commit 5fec2f8eaf3b python3:3.9.0
sha256:fffdd8a20d2be7bb4c06130b41c000bdd1fc3cffb3f757c2ebd329d982bc2f95

?提示:docker commit <container_id> <image_name>:<tag> 用来将正在运行的容器制作成镜像。镜像名字和标签可以按照自己的需求定义。

通过docker images命令,可以看到刚刚制作的镜像:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python3             3.9.0               fffdd8a20d2b        4 minutes ago       1.02GB
centos              7.4.1708            9f266d35e02c        21 months ago       197MB

至此,镜像的制作就基本完成了。

常见问题

1. 为什么不将python3命令配置成python

在CentOS服务器上,我们可以在 ~/.bash_profile中配置别名的方式将python3命令简化成python。但是通过配置别名的方式无法在容器内部良好的实现。因为服务器或安装CentOS镜像的虚拟机(注意虚拟机镜像不是Docker镜像)带有完整的操作系统,在操作系统启动的过程中,会执行 boot 的所有初始化操作。但 Docker 则不是, Docker 只运行我们设置需要启动运行的脚本,否则不会自己运行。因此每次使用/bin/bash进程进入container内部,不会自动的加载环境变量文件,也就无法使别名生效。除非docker容器自动后,手动source ~/.bash_profile,但这样无疑增加了使用复杂度,没有意义。

但并非无法使用python命令直接调用python3。我们可以在/usr/bin目录下将python3重命名为python即可。但是这个操作并不推荐大家使用,首先会覆盖原有的python文件(原有的python文件是python2版本)。不过这个问题倒容易解决,我们只需要在重命名前备份即可。其次,系统中的一些工具代码依赖python2,如果我们强行将python3重命名为python,会导致一些工具无法使用(比如yum)。以yum为例,解决这个问题需要在/usr/bin/yum文件中把第一行注释修改为 #!/usr/bin/python2 就可以规避。

2. 将镜像打包

镜像制作完成后,可以使用docker save命令将镜像打包为tar文件。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python3             3.9.0               fffdd8a20d2b        28 minutes ago      1.02GB
centos              7.4.1708            9f266d35e02c        21 months ago       197MB
$ docker save -o python3.9.0_image.tar python3:3.9.0
$ ll
total 1026592
drwxr-xr-x 3 root root       4096 Dec 10 06:33 ./
drwxr-xr-x 9 root root       4096 Dec 10 05:46 ../
-rw------- 1 root root 1049639424 Dec 10 06:33 python3.9.0_image.tar

上面的操作将我们制作的python3:3.9.0镜像打包为python3.9.0_image.tar文件。


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