本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
#!/bin/bash
DB_HOST="172.10.1.90"
DB_PORT=3306
DB_USER=root
DB_PWD=XXXXXX
DB_NAME=XXXX
docker exec mysql_container_name -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PWD ${DB_NAME} -e "ALTER TABLE XXX ADD COLUMN create_time datetime NULL,ADD COLUMN modify_time datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;"
exit 0
踩坑就是刚开始监控这个脚本通过python脚本监控语句执行这个bash脚本
run_script_process = subprocess.Popen('chmod +x %s && cd %s && %s' % (DB_UPDATE_script, os.path.dirname(DB_UPDATE_script), DB_UPDATE_script), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
但是之前我脚本里的内容是docker exec -it mysql_container_name
-it这大坑导致一直添加不了mysql字段 因为-it是进入终端运行 但是脚本执行不能进入终端 只能说docker的命令含义还是要理解透彻 然后去掉-it问题就解决了
- it指的是啥
-i:以交互模式运行容器 -t:为容器重新分配一个伪输入终端 2. 伪输入终端 单纯输入-t参数时
[root@VM-20-7-centos ~]docker run -t centos [root@db3209a7a830 /] 会出现一个可以输入的命令行,但是在命令行中输入信息不会有回应(无法交互),不会处理执行命令,输入exit也不会退出 所以-t的伪输入终端指的应该是应该可以输入命令行的东西,但是不会处理命令,需要加上-i参数才可以
- 交互模式 单纯输入-i参数时 不会出现可以输入命令行的东西,但是依旧可以执行命令,例如ls或者exit等
exit [root@VM-20-7-centos ~] 总结
Options | Mean |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用; |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用; |
-d | 后台运行容器,并返回容器ID; |
-it中 i 是主体,输入 i 可以执行命令,t 更像是起到一种美化的功能 | |
一半来讲,如果启动的1号进程是 /bin/bash (或者类似程序)的话, -i 是交互的意思,如果没有 -i 选项,/bin/bash 不需要交互就没事干,会立即退出,然后容器就会退出; -t是分配终端,如果没有-t ,则 docker attach 进去的话,就没法和/bin/bash 进行交互,当然,如果你压根儿不知道attach或者压根儿没用过attach的话,你可能永远不知道这个-t有啥用; |
所以说, -it 选项是和 /bin/bash attach 有直接关系