我司的 Java 编写的微服务通过 Docker 容器部署,最近有一项功能需要执行 Python 脚本获取返回值,此时就需要容器中带上Python的环境才可以,记录下搭建过程。

一、使用 Dockerfile 文件构建

这种方式的好处是,只需要一条命令即可解决我们的需求

1、创建Dockerfile文件

vi Dockerfile

2、文件内容如下

FROM adoptopenjdk/openjdk11:centos-jre

RUN yum update -y && yum install wget gcc openssl-devel bzip2-devel libffi-devel sqlite-devel -y

RUN wget https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tgz && tar -xf Python-3.8.17.tgz && cd Python-3.8.17 && ./configure --enable-optimizations && make -j 4 && make altinstall

RUN pip3.8 config set global.index-url https://mirrors.aliyun.com/pypi/simple && /usr/local/bin/python3.8 -m pip install --upgrade pip

3、执行镜像构建命令

docker build -t 打包的镜像名称:镜像版本 /dockerfile文件的路径(如果文件在当前路径下,用一个点号"."代替即可)

二、进入容器执行命令构建

这种方式适用于我们还有其他个性化需求配置的情况下,灵活性更高

1、下载带有 JDK11 的基础镜像并进入容器

docker run -it --name base-image adoptopenjdk/openjdk11:centos-jre

2、更新容器中已安装的软件包到最新版本

yum update -y

3、使用 yum 安装一些基础软件包,安装 Python 时需要

yum install wget gcc openssl-devel bzip2-devel libffi-devel -y
  • gcc 是 C 编译器,用于编译 Python 的源代码。

  • wget 用于之后从官网下载 Python 安装包。

  • openssl-devel 是 OpenSSL 库的开发包,用于支持加密功能。

  • bzip2-devel 是 bzip2 压缩库的开发包,用于支持 bzip2 压缩算法。

  • libffi-devel 是 libffi 库的开发包,用于支持 C 语言调用外部函数的功能。

  • zlib-devel 是 zlib 压缩库的开发包,用于支持 zlib 压缩算法。

4、安装 Python3.8.17

1.下载 Python 安装包
wget https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tgz

2.解压安装包至当前目录
tar -xf Python-3.8.17.tgz

3.进入解压后的安装目录
cd Python-3.8.17

4.使用 --enable-optimizations 标志启用一些优化选项
./configure --enable-optimizations

5.编译 Python。-j 选项可指定编译时使用的核心数,用于加快编译速度。
make -j 4

6.将编译后的 Python 安装到系统中,使用 altinstall 而不是 install 是为了避免覆盖系统默认的 Python 版本。
make altinstall

7.查看 Python 是否安装成功
python3.8 --version

5、设置 pip 镜像源为阿里云,用于后续加速下载python所需的依赖

pip3.8 config set global.index-url https://mirrors.aliyun.com/pypi/simple

6、升级 pip 到最新版本。

/usr/local/bin/python3.8 -m pip install --upgrade pip

7、将后续需要在容器中执行的脚本和依赖文件导入到容器中并安装依赖

pip3.8 install -r requirements.txt

8、exit 命令退出容器,使用 docker commit 命令打包容器为镜像

docker commit -m="带有java\python环境的镜像" 第一步时创建的容器ID 镜像名称:镜像版本

9、如果有自己的镜像仓库,可以把打包好的镜像推送到自己的仓库中

1.登录镜像仓库
docker login 镜像仓库地址 -u 用户名 -p 密码

2.推送至镜像仓库
docker push 镜像名称:镜像版本

3.下次需要使用时可以通过 docker pull 命令拉取.