大约三四年前,因工作原因就一直在使用docker。期间频繁遇到需要“进到容器看一看”的情况,经同事分享,就知道了exec这个命令。
当时的情况是,一个服务启失败,docker logs查看一直报错,却不知道是不是打镜像的时候文件放错了,于是就通过 docker exec -it 容器名称 /bin/bash 就进到容器里面了,可以查看容器内部的文件系统,排查错误。
就这么用了好久,一直给我的印象就是 docker exec -it 容器 /bin/bash 就是进到容器的命令。甚至不知道exec到底是什么含义。直到最近,项目要求做数据库的定时备份,由于数据库选的是mysql,网上的方案也比较多,基本上Linux就是crontab + shell,windows是系统配置定时任务+bat。
问题来了,用dump命令是需要在shell上执行的,我现在是数据库容器,不是安装包可以在系统的shell执行命令,难不成还要我exec -it /bin/bash 进到容器里面再执行dump?这显然是不能的,于是决定再仔细看官方文档。
exec 实际上要表达的是在一个运行状态下的容器里执行命令。这一下就豁然开朗了,通过借助exec命令能让在容器里和宿主机上一样执行命令。
回头再看 docker exec -it 容器 /bin/bash 这个命令行,其实就是通过 -it 的模式执行了一下/bin/bash,用虚拟机试了一下:
其实就是以交互方式新开了一个TTY。
一知半解确实是致命伤。