分享一个用docker制作不同python环境的方法。
python的版本更新很快,这些版本都可以从官网下载到源码。在工作中涉及给老代码搭建环境的问题,而系统源里很有可能是没有对应的python版本的,这时候,我们就需要手动搭建环境了。在系统中搭建的方法可以查看往期文章:https://www.madbull.site/?p=1933
下载了源码,制作docker镜像就比较简单了。下面是以python3.7.8为例制作的Dockerfile 文件。系统镜像使用的阿里龙蜥8.6环境(CentOS的平替系统)。在国内官网docker的源不太友好,所有需要修改一下docker源为国内的镜像,这样下载更快更方便。修改源具体方法查看往期文章:https://www.madbull.site/?p=2060 安装运行 小节。
# 使用 OpenAnolis 8.6 作为基础镜像
FROM anolisos:8.6
# 设置系统源
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirrors.tuna.tsinghua.edu.cn/anolis|baseurl=https://mirrors.aliyun.com/anolis|g' \
-i.bak /etc/yum.repos.d/*.repo
# 安装编译 Python 3.7 所需的依赖
RUN dnf update -y && \
dnf groupinstall -y "Development Tools" && \
dnf install -y \
wget \
gcc \
make \
zlib-devel \
bzip2-devel \
readline-devel \
sqlite-devel \
openssl-devel \
ncurses-devel \
tk-devel \
libffi-devel \
xz-devel \
gdbm-devel \
vim \
net-tools \
tzdata && \
dnf clean all
# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 设置环境变量
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONUNBUFFERED 1
# 下载并编译安装 Python 3.7。直接下载可能会下载失败,可以用浏览器下载好后COPY到镜像。
# wget https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz
COPY Python-3.7.8.tgz .
RUN tar xzf Python-3.7.8.tgz && \
cd Python-3.7.8 && \
./configure --enable-optimizations --enable-shared --prefix=/usr/local LDFLAGS="-Wl,-rpath /usr/local/lib" && \
make -j$(nproc) && \
make altinstall && \
rm -rf Python-3.7.8*
# 创建符号链接
RUN ln -s /usr/local/bin/python3.7 /usr/local/bin/python3 && \
ln -s /usr/local/bin/pip3.7 /usr/local/bin/pip3
# 配置pip
RUN pip3.7 config set global.index-url https://pypi.doubanio.com/simple
# 安装依赖 requirements.txt 是 python服务 需要安装的库。
COPY requirements.txt /app/requirements.txt
RUN pip3.7 install --no-cache-dir -r /app/requirements.txt
# 另外,对于python2.X,官方已经不再支持了,就算官网支持,但是还是有一些库pip下载不到的情况,怎么办呢?
# 注意到:在编译的时候,我们把python3.7的库安装在了 /usr/local/lib/python3.7/,如果pip源里找不到,而我们手里有对应版本的库。可以直接把依赖复制到 /usr/local/lib/python3.7/site-packages 目录下即可。
# 例如,yara的库就整理的不太好,我就是直接拿原系统的库整理的。
COPY yara_python-4.2.0-py3.7-linux-x86_64.egg/yara.py /usr/local/lib/python3.7/site-packages/yara.py
COPY yara_python-4.2.0-py3.7-linux-x86_64.egg/yara.cpython-37m-x86_64-linux-gnu.so /usr/local/lib/python3.7/site-packages/yara.cpython-37m-x86_64-linux-gnu.so
COPY yara_python-4.2.0-py3.7-linux-x86_64.egg/libyara.so.9.0.1 /lib/libyara.so.9.0.1
RUN ln -s /lib/libyara.so.9.0.1 /lib/libyara.so.9 && ldconfig
# 设置工作目录
WORKDIR /app
# 拷贝你的python服务
COPY YOUR_SERVER /app/YOUR_SERVER
# 可以创建你需要的目录,运行时可以设置挂载宿主机的目录。
RUN mkdir -p /app/log /data
# 启动命令。注意:这里一定不要后台运行。如果转为后台,则会被认为docker已运行完成。
CMD ["python3.7", "YOUR_SERVER/YOUR_SERVER.py"]
发表回复