【发布时间】:2020-10-30 09:53:03
【问题描述】:
我从事一个项目,我需要自动安装服务器。 服务器与我在 GitHub 上获得的存储库一起工作,然后启动服务以使服务器正常工作。
所以感谢我的 bash 脚本,我获得了所有存储库,我启动了容器,但之后我在恢复 mysql 数据库时遇到了问题:
我需要在我的容器上执行一些命令,所以我像这样将自己连接到容器:
docker exec -ti {my_container_name} sh
当我的脚本执行此命令时,会打开一个 shell,我可以键入其余命令,当我键入 exit 时,将执行以下其余命令:
cd /var/lib/mysql/restore
echo 'CREATE DATABASE apik;USE apik;' | cat - apik.db.sql > temp && mv temp apik.db.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik.db.sql
echo 'CREATE DATABASE apik_data;USE apik_data;' | cat - apik_data.db.sql > temp && mv temp apik_data.db.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik_data.db.sql
echo 'USE apik;' | cat - apik.data.sql > temp && mv temp apik.data.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik.data.sql
exit
如果我在已打开的 shell 中键入它们,所有命令都可以工作,但这是我的问题 .. 我需要用键盘键入它们,但我会由脚本为我完成。
我搜索了很多东西来做这件事,但我没有找到一个好的方法。
所以我想要的是当docker exec ...命令执行时,我希望这个命令之后的命令在第一个命令打开的shell中执行。
这是我目前拥有的代码:
git clone git@<git_file>.git ${APIK_ROOT_DIRECTORY}/data/mysql/restore
docker exec -ti mysql_mysql_1 sh
cd /var/lib/mysql/restore
echo 'CREATE DATABASE apik;USE apik;' | cat - apik.db.sql > temp && mv temp apik.db.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik.db.sql
echo 'CREATE DATABASE apik_data;USE apik_data;' | cat - apik_data.db.sql > temp && mv temp apik_data.db.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik_data.db.sql
echo 'USE apik;' | cat - apik.data.sql > temp && mv temp apik.data.sql
mysql --user=root --password=$MYSQL_ROOT_PASSWORD < apik.data.sql
exit
我们可以在我的屏幕上看到,当我的脚本执行 docker exec 命令时,一个 shell 被打开并且我的脚本被暂停。当我退出这个 shell 时,剩下的命令就是 exec。但我希望在 shell 打开时执行命令。
【问题讨论】:
-
在运行容器时使用 -v 创建从主机到 docker 容器的映射驱动器,然后从容器中的映射驱动器运行脚本
标签: mysql bash docker shell containers