Linux- 从0编写Docker镜像自动执行脚本.sh

目录

前言

Shell基本知识

第一个Docker执行脚本


前言

最近在使用Jenkins + Docker做自动化构建的时候,发现有些需要在服务器上执行一些必不可少的Linux命令,而这些命令都是些重复的手工操作。故而想着通过脚本.sh文件来替代这些manual操作。

在之前的工作中很少写sh脚本,所以将整理的在这里记录下来,一是好记性不如烂笔头,以防自己过几天就忘了,二也是希望可以帮到和我有同样需求的人。

Shell基本知识

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

第一个简单的shell脚本:

#!/bin/bash
echo "Hello World !"
  • #!/bin/bash:/bin/bash是一定存在的。所以/bin/bash是显示指定的优先选择。
  • #!/usr/bin/env bash:用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中

大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;

chmod +x ./test.sh #使脚本具有执行权限

./test.sh #执行脚本

 

第一个Docker执行脚本

这里提供一个运行springboot-test镜像的脚本:

#!/usr/bin/env bash
app_name='springboot-test'
app_port='8080'

# 停止正在运行的容器
echo '......stop container......'
docker stop ${app_name}

# 删除容器
echo '......rm container......'
docker rm ${app_name}

# 删除none镜像
echo '......rm none images......'
docker rmi `docker images | grep none | awk '{print $3}'`

# 重新生成并运行容器
echo '......start container......'
docker run -p ${app_port}:${app_port} --name ${app_name} \
--link redis:redis \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /home/myapp/${app_name}/logs:/var/logs \
-d test/${app_name}

命令解释:

  • app_name='springboot-test':定义项目变量名;
  • docker stop ${app_name}:根据容器名称:“NAMES”,停止正在运行的容器;
  • docker rmi `docker images | grep none | awk '{print $3}'`:删除镜像名字是“none”的镜像,这里使用none,是因为使用Jenkins构建的时候,重新生成了镜像名字相同的镜像,导致以前版本的镜像被替换成none;

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具

echo '11 22 33 44' | awk '{print $3" "$2" "$1}'
输出:33 22 11

这里的docker images | grep none | awk '{print $3}',将输出REPOSITORY是none的镜像IMAGE ID

反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`;

末尾“\”:换行输入多条命令

  • --link redis:redis:连接容器redis,进行通信;
  • -e TZ="Asia/Shanghai":设置环境变量TZ="Asia/Shanghai",这里设置时区;
  • -v /etc/localtime:/etc/localtime:run容器时添加参数挂载宿主时间配置
  • -v /home/myapp/${app_name}/logs:/var/logs:将宿主机目录/home/myapp/${app_name}/logs,挂载到容器/var/logs下

此命令可以将容器的日志备份到宿主机上,且删除容器的时候日志不会跟着被删除,避免日志丢失。

  • -d :后台运行
  • -p hostPort:containerPort
  • --name:指定容器名称
  • 最后的test/${app_name}:使用的镜像名称;

 

本文参考:

Linux awk 命令

Shell 教程

linux awk 一看就懂

docker命令之link

猜你喜欢

转载自blog.csdn.net/qq_26878363/article/details/110433226