背景
为了让更多人使用我自己开发的服务,我选择了容器化的方式进行部署。然而,每次服务代码更新后,都需要重新制作镜像进行部署,这样的流程显得十分繁琐。因此,我希望能够在代码仓库更新后,简单处理一下,就能自动拉取最新代码进行部署和测试。
经过对容器相关知识的了解,我发现可以实现这一需求。
解决方案
在 Docker 创建容器的命令中,可以支持在容器内执行指定的脚本,这个脚本在容器每次启动或者重启后自动执行。因此,我们可以编写一个脚本,实现自动拉取最新代码并进行安装部署。
例如(main.sh):
#!/bin/bash
# 代码分支
export code_branch=master
echo '拉取最新代码'
rm -rf Demo/
git clone -b ${code_branch} --depth=1 http://oauth2:t9sTVEuCWcL-m1fHsbG_@mq.code.xxx.org/Devops/Demo.git
# 删除 临时目录 报告目录 日志目录...
rm -rf ./Demo/tempdirs ./Demo/reports ./Demo/log
# 复制到工作空间
cp -rf ./Demo/* .
# 删除源代码
rm -rf Demo/
echo 'kill 旧进程'
# 过滤出指定程序的进程号 杀死指定程序的进程
pid=$(ps aux | grep 'python3 ./app.py' | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
kill -9 $pid
fi
# 创建临时文件夹
if [ ! -d "./tempdirs" ]; then
mkdir tempdirs
fi
# 创建报告文件夹
if [ ! -d "./reports" ]; then
mkdir reports
fi
echo '安装依赖'
pip3 install -r ./requirements.txt
echo '启动服务'
python3 ./app.py
可以将上述main.sh 脚本放置在执行机器 /home/Demo目录下,然后将该目录挂载到容器内,容器内执行的命令为 sh main.sh 这样每次启动或者重启容器,都会自动拉取最新代码进行部署,如果需要修改部署代码分支,只需要修改main.sh脚本中的分支参数后重启容器即可
容器命令
docker run -it -v /home/Demo:/Demo -w /Demo -p 8123:8123 --name Demo_server docker.xxx.com/cicd_0001/py2_and_py3:v1 sh main.sh
各部分解释
- docker run: 这是 Docker 的命令,用于创建并运行一个新的容器。
- -it: 这两个选项结合使用,-i 表示以交互模式运行容器(保持标准输入打开),-t 表示分配一个伪终端(TTY)。这通常用于需要用户交互的场景。
- -v /home/Demo:/Demo: 这个选项用于挂载卷(volume)。它将宿主机的 /home/Demo 目录挂载到容器内的 /Demo 目录。这样,容器内的应用可以访问宿主机上的文件。
- -w /Demo: 这个选项设置容器的工作目录为 /Demo。这意味着在容器启动后,所有的命令都会在这个目录下执行。
- -p 8123:8123: 这个选项用于端口映射。它将宿主机的 8123 端口映射到容器的 8123 端口。这使得外部可以通过宿主机的 8123 端口访问容器内的服务。
- –name Demo_server: 这个选项为容器指定一个名称 Demo_server。这样可以方便地通过名称来管理和引用这个容器。
- docker.xxx.com/cicd_0001/py2_and_py3:v1: 这是要运行的 Docker 镜像的名称和标签。它指定了从哪个镜像创建容器。在这个例子中,镜像位于 docker.xxx.com 的私有仓库中,名称为 cicd_0001/py2_and_py3,版本为 v1。
- sh main.sh: 这是在容器内执行的命令。它会运行 main.sh 脚本,sh 是用于执行 shell 脚本的命令。