test示例:
docker run --rm -p 8200:8200 -v ~/seacode/:/opt/ python:3.10.17-slim /
/bin/bash -c "pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=1000 --no-cache-dir -r /opt/requirements.txt &&cd opt && python /opt/seaApp.py"
pd:
docker run -itd --restart=unless-stopped -p 8200:8200 -v ~/seacode/:/opt/ python:3.10.17-slim / /bin/bash -c "pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=1000 --no-cache-dir -r /opt/requirements.txt &&cd opt && python /opt/seaApp.py"
jenkins 示例:
IS_ADD_IMPORT =true 表示需要重新安装依赖
set -e date_tag=`date +%Y%m%d_%H%M%s` Local_DIR=`pwd` Dest_DIR=/opt/jenkins_project/${date_tag} mkdir -v ${Dest_DIR} SERVICE_NAME=ACCT-REPORT-SERVICE-DEV echo ${SERVICE_NAME} cp -r ${Local_DIR}/* ${Dest_DIR} # 打包,不包含目录 tar -czf ${SERVICE_NAME}.tar.gz -C ${Dest_DIR} . echo "SERVICE_NAME=${SERVICE_NAME}" >> ${Local_DIR}/imageName echo "IS_ADD_IMPORT=${IS_ADD_IMPORT}" >> ${Local_DIR}/imageName rm -rf ${Dest_DIR}


!!!!!!!!!!!! 系统生成的文件夹 __pycache__ 是root 用户组的,当前用户没有权限删除, 最终方案, 不删除, 直接覆盖有效文件
当前最优方案 (解决二次发布,之前的py文件删除权限问题) 如果存在容器,直接再容器中删除(容器有权限)
#!/bin/bash set -e # 调试信息 echo "当前目录: $(pwd)" echo "SERVICE_NAME: ${SERVICE_NAME}" echo "IS_ADD_IMPORT: ${IS_ADD_IMPORT}" # 检查必要变量 if [ -z "${SERVICE_NAME}" ]; then echo "错误: SERVICE_NAME 变量未设置" exit 1 fi # 创建目录 mkdir -p "${SERVICE_NAME}" ####### prepare data ############ # 检查压缩包是否存在 if [ ! -f "${SERVICE_NAME}.tar.gz" ]; then echo "错误: ${SERVICE_NAME}.tar.gz 文件不存在" exit 1 fi # 删除容器内的文件(如果容器存在) if docker ps -a --format '{{.Names}}' | grep -q "^${SERVICE_NAME}$"; then if docker inspect -f '{{.State.Status}}' "${SERVICE_NAME}" | grep -q "running"; then echo "删除容器内旧文件..." docker exec "${SERVICE_NAME}" rm -rf /opt/* || echo "警告: 删除容器内文件失败" fi fi # 移动并解压文件 mv "${SERVICE_NAME}.tar.gz" "${SERVICE_NAME}/" cd "${SERVICE_NAME}" tar -zxf "${SERVICE_NAME}.tar.gz" ###### 如果不需要下载依赖(时间比较久),到这里直接重启容器 ###### if [ "${IS_ADD_IMPORT}" = "0" ]; then echo "没有新添加依赖,更新代码,重启容器" # 检查容器是否存在且运行 if docker ps --format '{{.Names}}' | grep -q "^${SERVICE_NAME}$"; then docker restart "${SERVICE_NAME}" echo "容器重启完成" else echo "错误: 容器 ${SERVICE_NAME} 不存在或未运行" exit 1 fi else echo "新添加依赖,需要下载依赖,重新构建容器" ######## run docker ##### # stop 避免无法修改文件,被占用 echo "Stop old container if exist" docker stop "${SERVICE_NAME}" 2>/dev/null || true sleep 3 docker rm "${SERVICE_NAME}" 2>/dev/null || true sleep 3 echo "Download the latest image" # docker pull ${IMAGE} # 如果有镜像需要拉取,取消注释 echo "Start create container" ######## 这里需要修改 主类 or --net=host -p80:81 ######### #### cd /opt 需要到主类下,避免导入依赖错误 # 获取当前用户ID和组ID CURRENT_UID=$(id -u) CURRENT_GID=$(id -g) LOCAL_DIR=$(pwd) # 创建容器 docker run -itd \ --privileged \ --restart=unless-stopped \ -p 7857:7857 \ --name="${SERVICE_NAME}" \ -v "${HOME}/${SERVICE_NAME}/:/opt/" \ -e "AP_ENV=DEV" \ -e "CONFIG_SERVERS=http://10.180.3.148:8090" \ python:3.11-slim-bullseye \ /bin/bash -c "\ apt-get update && \ apt-get install -y libcairo2-dev libpango1.0-0 && \ pip install --default-timeout=1000 --no-cache-dir -r /opt/requirements.txt && \ cd /opt/code && \ python /opt/code/ReportApp.py" echo "End create container" fi # 返回原目录 cd ..
ssh shell: (方案1)
set -e echo $SERVICE_NAME echo ${IS_ADD_IMPORT} mkdir -p $SERVICE_NAME ####### prepare data ############ (mkdir 可能有权限问题) # 删除之前的文件(使用docker 删除,避免权限问题) docker exec ${SERVICE_NAME} rm -rf /opt/* mv ${SERVICE_NAME}.tar.gz ${SERVICE_NAME} cd ${SERVICE_NAME} tar -zxf ${SERVICE_NAME}.tar.gz ######如果不需要下载依赖(时间比较久),到这里直接重启容器###### if [ "${IS_ADD_IMPORT}" = "0" ]; then echo "没有新添加依赖,更新代码,重启容器" docker restart ${SERVICE_NAME} else echo "新添加依赖,需要下载依赖,重新构建容器" ######## run docker ##### # stop 避免无法修改文件,被占用 echo "Stop old container if exist" docker stop $SERVICE_NAME || true sleep 3 docker rm $SERVICE_NAME || true sleep 3 echo "Download the latest image" #docker pull ${IMAGE} echo "Start create container" ######## 这里需要修改 主类 or --net=host -p80:81 ######### #### cd /opt 需要到主类下,避免导入依赖错误 CURRENT_UID=$(id -u) CURRENT_GID=$(id -g) Local_DIR=`pwd` docker run -itd --privileged --restart=unless-stopped -p7857:7857 --name=${SERVICE_NAME} -v ~/${SERVICE_NAME}/:/opt/ -e 'AP_ENV=DEV' -e 'CONFIG_SERVERS=http://192.168.18.199:8090' python:3.11-slim-bullseye /bin/bash -c "apt-get update&&apt-get install -y libcairo2-dev&&apt-get install -y libpango1.0-0&&pip install --default-timeout=1000 --no-cache-dir -r /opt/requirements.txt &&cd /opt/code && python /opt/code/ReportApp.py" echo "End create container" fi
ssh shell (方案2)
set -e echo $SERVICE_NAME echo ${IS_ADD_IMPORT} mkdir -p $SERVICE_NAME # __pycache_ 删除不掉
#chmod -R 777 $SERVICE_NAME #rm -rf $SERVICE_NAME/* ####### prepare data ############ chmod 777 ${SERVICE_NAME}.tar.gz mv ${SERVICE_NAME}.tar.gz ${SERVICE_NAME} cd ${SERVICE_NAME} tar -zxf ${SERVICE_NAME}.tar.gz ######如果不需要下载依赖(时间比较久),到这里直接重启容器###### if [ "${IS_ADD_IMPORT}" = "0" ]; then echo "没有新添加依赖,更新代码,重启容器" docker restart ${SERVICE_NAME} else echo "新添加依赖,需要下载依赖,重新构建容器" ######## run docker ##### # stop 避免无法修改文件,被占用 echo "Stop old container if exist" docker stop $SERVICE_NAME || true sleep 3 docker rm $SERVICE_NAME || true sleep 3 echo "Download the latest image" #docker pull ${IMAGE} echo "Start create container" ######## 这里需要修改 主类 or --net=host -p80:81 ######### #### cd /opt 需要到主类下,避免导入依赖错误 docker run -itd --restart=unless-stopped -p8200:8000 --name=${SERVICE_NAME} -u $(id -u):$(id -g) -v ~/${SERVICE_NAME}/:/opt/ python:3.10.17-slim /bin/bash -c "pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=1000 --no-cache-dir -r /opt/requirements.txt &&cd /opt/code && python /opt/code/ReportApp.py" echo "End create container" fi
浙公网安备 33010602011771号