jenkins shell:

set -e
export NODEJS_HOME=/root/nodejs/node-v24.16.0
export PATH=$NODEJS_HOME/bin:$PATH

############ 仅仅修改这里 , 其它地方不用动 ##############
SERVICE_NAME=pd-sea-provider-web
echo ${SERVICE_NAME}
date_tag=`date +%Y%m%d_%H%M%s`
Dest_DIR=/opt/jenkins_project/${SERVICE_NAME}${date_tag}
Local_DIR=`pwd`
mkdir -p ${Dest_DIR}
chmod -R  777 ${Dest_DIR}
# *****  build vue project 
#npm install
#npm run build
#set http_proxy=http://192.168.3.168:7980
#set https_proxy=http://192.168.3.168:7980
pnpm --registry https://registry.npmmirror.com  i
pnpm run build
#cp  dist/*  ${Local_DIR}
#sed -i 's/https:\/\/wwx.cn\/api/https:\/\/www.baxians.net\/bxtation/g'   ./dist/app.config.js




#change-domain-entrypoint.sh    it will running  before  the service  started
############  这里可能需要修改 ####################
cat > "${Dest_DIR}/change-domain-entrypoint.sh" <<'EOF'
#!/bin/bash
# 域名替换逻辑
sed -i 's/\${DEV_DOMAIN}/\${NEW_DOMAIN}/g' /usr/share/nginx/html/static/js/*.js

# 覆盖 Nginx 默认配置,添加 try_files
cat > /etc/nginx/conf.d/default.conf <<'INNER_EOF'
server {
    listen 80;
    server_name localhost;
    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }
}
INNER_EOF
EOF

# docker-entrypoint.sh
cp -f /root/web_docker/Dockerfile   ${Dest_DIR}/Dockerfile
#cp -f /root/web_docker/docker-entrypoint.sh   ${Dest_DIR}/docker-entrypoint.sh


# start build image
cd  ${Dest_DIR}

echo '192.168.18.69:5000/${Image_Name}:${tr_version}'
docker build -t 192.168.18.69:5000/${SERVICE_NAME}:${tr_version} .
echo "push to docker repository"
docker push 192.168.18.69:5000/${SERVICE_NAME}:${tr_version}

# add env
echo "IMAGE=192.168.18.69:5000/${SERVICE_NAME}:${tr_version}" > ${Local_DIR}/docker_imageName
echo "SERVICE_NAME=${SERVICE_NAME}" >> ${Local_DIR}/docker_imageName
imageId=$(docker images -a|grep ${SERVICE_NAME}|awk '{print $3 }')

echo "del image"
docker rmi -f $imageId
mv   ${Dest_DIR}  $Local_DIR/xxx
cd $Local_DIR

 

 

 

 

 

 

 

Dockerfile:

FROM nginx:1.21.3
# 1. 复制静态文件(假设当前目录包含 index.html 等)
COPY . /usr/share/nginx/html/
# 2. 将自定义初始化脚本放入官方入口点自动执行目录
COPY change-domain-entrypoint.sh /docker-entrypoint.d/change-domain-entrypoint.sh
# 3. 赋予执行权限
RUN chmod +x /docker-entrypoint.d/change-domain-entrypoint.sh
# 4. 暴露端口
EXPOSE 80
# 5. 使用默认 CMD(官方入口点会自动执行 /docker-entrypoint.d/*.sh 后再启动 nginx)
CMD ["nginx", "-g", "daemon off;"]

它使用官方 Nginx 镜像的 /docker-entrypoint.d/ 机制,在 Nginx 启动前自动执行 change-domain-entrypoint.sh,完成域名替换和 Nginx 配置覆盖(添加 try_files

配套的 change-domain-entrypoint.sh 脚本内容

#!/bin/bash

# 域名替换:将 JS 文件中的字面字符串 ${DEV_DOMAIN} 替换为 ${NEW_DOMAIN}
# 注意:这里使用反斜杠转义 $,避免被 shell 解释为变量
sed -i 's/\${DEV_DOMAIN}/\${NEW_DOMAIN}/g' /usr/share/nginx/html/static/js/*.js

# 覆盖 Nginx 默认配置,添加 try_files 支持 SPA 路由
cat > /etc/nginx/conf.d/default.conf <<'INNER_EOF'
server {
    listen 80;
    server_name localhost;
    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }
}
INNER_EOF

脚本说明:

  • 第一行 #!/bin/bash:使用 bash 以确保 Here-Document 等特性正常。

  • 域名替换sed 命令中的 \${DEV_DOMAIN} 会在脚本运行时被原样传递给 sed,从而替换文件中的字面字符串 ${DEV_DOMAIN}${NEW_DOMAIN}(也是字面量)。如果你期望的是环境变量展开,请去掉反斜杠,但根据你的需求,你应该是替换占位符。

  • Nginx 配置覆盖:使用带引号的 <<'INNER_EOF',保证内部的 $uri 不会被 shell 解释,原样写入配置文件。

  • 所有操作都在 Nginx 启动前完成,因此容器启动后即可生效。

 

posted on 2026-06-05 12:55  lshan  阅读(12)  评论(0)    收藏  举报