您现在的位置是:首页 >技术交流 >Docker---python项目部署网站首页技术交流
Docker---python项目部署
简介Docker---python项目部署
一:容器内部PY文件如何加密?
- 需求:
- 有些服务需要提供给合作方, 但是我们又不想让他们知道我们具体实现的源码文件,此时我们可以考虑给对方一个镜像, 而镜像中只有可执行文件, 没有源码文件。
- 方案:
- 使用pyinstaller 加密方式, 将文件打包成可执行文件。
- 例如:pyinstaller --hidden-import=gunicorn.workers.ggevent --hidden-import=lightgbm --key sfdsfdsfaq --clean -F run.py --name XXXX
- 默认可执行文件放在./dist/下
二:Python镜像太大怎么办?
- 需求: 使用python镜像, 最终打包的镜像tar包一般在800M以上。 由于一些原因, 我们的服务只能部署到对方提供的隔离区中, 因此每次代码的更新都需要对上G的镜像传递到隔离区中,导致速度很慢。
- 解决方案:将可执行文件复制到很小的alpine镜像中, 在alpine镜像中启动自己的服务。 最终我们的镜像大小只有70M。
# 使用alpine基础镜像
FROM frolvlad/alpine-glibc:alpine-3.12
WORKDIR /home/user_00/ddc_cloud_interface/
COPY --chown=user_00:users --from=builder /home/user_00/nterface/dist/interface .
三:容器的用户权限怎么处理?
- 需求:如果我们启动容器的时候不指定用户, 默认用的宿主机的root权限启动的。 此时项目生成的日志也是root权限生成的, 将日志映射出宿主机的日志也是root权限的, 如果你进入宿主机的权限是其他的, 则导致这个用户可能删除不了映射出的日志文件。
- 解决方案:在容器内生成用户(与宿主机保持一致), 用这个用户启动项目。
# 创建user_00用户
RUN adduser user_00 -S -G users -u 1000
# 切换用户
USER user_00
# 执行命令
CMD ["./可执行文件]
四:容器内部启动多进程
- 需求一般容器会指定一个前台进程, 其余的为该进程的子进程。 但是我们有些项目就是要求在容器中启动多个进程来增强服务的并发处理能力。
- 解决方案:容器启动的前台是个shell脚本, 脚本最终是个死循环。 死循环前面采用循环hohup 挂起后台du多个进程。
- 案例:
#!/bin/bash
start_gevent () {
# shellcheck disable=SC2126
N=$(ps aux | grep "XXXX服务" | grep -v grep | wc -l)
if [ ! $N -eq 0 ]; then
echo "process is running place waiting........."
else
# 循环启动10个进程
for((i=0;i<10;i++))
do
nohup "./XXXX服务" & 2>&1
done
# 循环检测进程是否完全启动
while true
do
# shellcheck disable=SC2009
CNT=$(ps aux | grep "XXXX服务" | grep -v grep | wc -l)
echo "$CNT"
if [ "$CNT" -eq 10 ]; then
echo "$SERVER_PROCESSOR_NAME start success ..."
break
else
sleep 1
fi
done
fi
# 主进程持续运行, 阻塞Docker防止Docker异常退出
echo "docker is running...."
while true
do
sleep 1
done
}
case "$1" in
start)
start_gevent
exit $?
;;
*)
echo "Usage: $0 { start }"
exit 1
;;
esac
五:Dockerfile案例
# 依赖Py3.8版本镜像
FROM python:3.8.8 AS builder
# 安装Py依赖
COPY requirements.txt /home/user_00/XXXXX服务/requirements.txt
WORKDIR /home/user_00/XXXXX服务/
RUN pip install --upgrade pip==23.1.2 -i https://reg.yingzhongtong.com/artifactory/api/pypi/pypi-public/simple --no-cache-dir gm-crypto==0.0.1.3
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
&& pip install -i https://pypi.douban.com/simple/ --no-cache-dir pyinstaller==3.6
&& pip install -i https://pypi.douban.com/simple/ --no-cache-dir pycrypto==2.6.1
# 拷贝PY源文件
COPY . /home/user_00/XXXXX服务
# 对项目进行加密
RUN pyinstaller --hidden-import=gunicorn.glogging --hidden-import=gunicorn.workers.ggevent --hidden-import=lightgbm --key TyV$LYu@Mckr05UmqQATJG]%lw#4H? --clean -F run.py --name XXXXX服务
# 使用alpine基础镜像
FROM frolvlad/alpine-glibc:alpine-3.12
#更新Alpine的软件源为国内(清华大学)
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
# 安装Bash
RUN apk update
&& apk upgrade
&& apk add --no-cache bash
bash-doc
bash-completion
&& rm -rf /var/cache/apk/*
&& /bin/bash
# 创建user_00用户
RUN adduser user_00 -S -G users -u 1000
# 将镜像时间设置成上海时间
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone && apk del tzdata
WORKDIR /home/user_00/XXXXX服务
# 拷贝可执行文件,使用user_00拷贝, 否则没有执行权限
COPY --chown=user_00:users --from=builder /home/user_00/XXXXX服务/dist/XXXXX服务 .
# 将日志路径也拷贝过来
COPY --chown=user_00:users --from=builder /home/user_00/XXXXX服务/logs logs
COPY --chown=user_00:users --from=builder /home/user_00/XXXXX服务/run.sh run.sh
RUN chmod 777 run.sh
# 切换用户
USER user_00
CMD ["/bin/bash", "run.sh", "start"]
```
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。