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"]
```

猜你喜欢

转载自blog.csdn.net/qq_41341757/article/details/130772467