背景
温馨提示:该工具仅用于Docker自动构建&部署容器,及提供思路参考。请大佬们直接略过!!!
前一段时间,前端小伙伴根据需求用Vue3+NodeJS整了一个项目,服务器用Docker拉起项目 运行环境服务。至此以为协助工作到此为止,结果....
在某天风和日丽的早上,前端小伙伴让我用最新镜像包,构建NodeJS容器。经过沟通NodeJS后端服务,需要频繁开发。为了从这个“深坑”脱离,解放双手,故绞尽脑汁想个法子解决。
注:服务器只能内网(经历相似情况,就知道蛋有多疼),且账号授权申请登陆贼麻烦
思路
- 本地打包最新镜像,且推送服务器。
- 通过PHP,执行.sh
- 自动构建,且启动容器
实现
假设已部署Docker,并且已启动Nginx、PHP服务哈
注:关于内网如何部署Docker,敬请期待
【本地】Docker镜像打包流程
# 构建镜像
docker build -t 镜像名:版本 .
# 查询镜像
docker images
# 导出镜像
docker save 镜像ID > 存放目录/xxx.tar
【服务器】编写.sh
#!/bin/bash
IMAGE_NAME="镜像名称"
# 查询容器ID
CONTAINER_ID=$(docker ps -qf "name=$IMAGE_NAME")
# 根据是否启动容器,执行删除命令
if [ -z "$CONTAINER_ID" ]; then
docker rmi $IMAGE_NAME
else
docker rm -f $CONTAINER_ID
docker rmi $IMAGE_NAME
fi
# 导入镜像
docker load < 新上传的镜像目录/xxx.tar
# 启动容器命令,设置端口/开机自启
docker run -i -t -d -p 80:80 --restart=always --name=$IMAGE_NAME xxx:latest
echo "Successful"
【服务器】PHP容器挂载&源码
本示例,通过PHP的exec函数执行.sh,外部是无法直接运行.sh!!!当然可以使用其他语言代替哈
注:需要将宿主机存放的镜像包目录、.sh文件挂载到PHP容器中
<?php
header('Content-Type:application/json; charset=utf-8');
// 自定义参数验证等
if ($_GET['token'] != 'xxxx') {
exit(json_encode([
'code' => 500,
'msg' => '无效的密钥'
]));
}
//要执行的命令
$command = 'sh xxx.sh 2>&1';
$output = [];
$return_status = 0;
exec($command, $output, $return_status);
$code = 500;
$res = [];
if ($return_status == 0) {
// 输出执行结果
$res = array_merge(['构建成功:'], $output);
$code = 200;
}
exit(json_encode([
'code' => $code,
'msg' => implode(PHP_EOL, $res)
]));
总结
保持学习的热情,尝试新的方法和技术,不断提高工作效率。