分析MySQL 5.6的Dockerfile(5)

[root@localhost ~]# mysql=( mysql --protocol=socket -uroot )
[root@localhost ~]# MYSQL_DATABASE=docker
[root@localhost ~]# mysql+=( "$MYSQL_DATABASE" )
[root@localhost ~]# echo ${mysql[@]}
mysql --protocol=socket -uroot docker

12>

for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)  echo "$0: running $f"; . "$f" ;;
                *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
                *)    echo "$0: ignoring $f" ;;
            esac
            echo
        done     

其它需要执行的shell脚本或者sql脚本,可放到/docker-entrypoint-initdb.d/目录下。只需启动容器时,通过-v参数将容器该目录挂载到宿主机目录上。

13>

if ! kill -s TERM "$pid" || ! wait "$pid"; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

关闭已启动的mysql server,可能很多人会感到好奇,不是提供mysql服务么?为什么还要关闭呢?

答案就在于dockerfile中CMD的命令为 ["mysqld"],如果不关闭的话,这里就无法启动。


这里比较有意思的还是在于脚本部分,

一、关于kill,kill命令是通过向进程发送指定的信号来结束进程的。

-s的意思是Specify the signal to send.  The signal may be given as a signal name or number.指定需要发送的信号.

如果没有指定发送信号,那么默认值为TERM信号。

关于-TERM和-9的区别

kill -TERM PID:TERM是请求彻底终止某项执行操作.它期望接收进程清除自给的状态并退出,它是一种较温和的方式。

kill -9 PID:

这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。
当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。
如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表

二、关于||运算符

关于&&和||的区别

command1 && command2 :左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行。

command1 || command2:左边的命令(命令1)执行失败了,就执行右边的命令(命令2)。

三、关于wait

wait命令用来等待指令的完成,直到其执行完毕后返回终端。

所以这段脚本的逻辑是首先用kill -s TERM "$pid"的方式关闭mysqld进程,如果执行成功了,则! kill -s TERM "$pid"的结果为false,这时候就执行wait "$pid",wait是等待mysqld的关闭,mysqld关闭完毕后,wait "$pid"结果为真,此时! wait "$pid"结果为假。echo语句就不执行。

至此,分析完毕~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/99928b6f9d32253dda82708cc891ef35.html