mysql - 借助 docker 容器中的 Bash 脚本执行命令
问题描述
我在一个项目上工作,我需要自动安装服务器。服务器与我在 GitHub 上获得的存储库一起工作,然后启动服务以使服务器正常工作。
所以多亏了我的 bash 脚本,我获得了所有存储库,我启动了容器,但之后我在恢复 mysql DB 时遇到了问题:
我需要在我的容器上执行一些命令,所以我将自己连接到容器,如下所示:
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 打开时执行命令。
解决方案
你可以试试这个:
git clone git@bitbucket.org:api-k/mysql-data.git ${APIK_ROOT_DIRECTORY}/data/mysql/restore
docker exec -ti mysql_mysql_1 sh << 'EOF'
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
EOF
推荐阅读
- python - 如何通过 tkinter 绑定传递更多参数
- java - 'UserDetailsService' 类型的 bean 不止一个。Beans:inMemoryUserDetailsManager
- c++ - 如何在不违反 C++ 核心准则的情况下将整数转换为 void*?
- python - 有没有办法在表格底部插入数据?
- javascript - 在 Ajax 中循环 JavaScript
- c++ - 为什么 fflush(stdin) 对输出没有影响?
- c# - ElasticSearch 数据的分组、计算和排序
- recursion - Sympy 中的递归类斐波那契函数
- c++ - 如何使用 while 循环找到 GCD?模运算符如何工作?
- r - 有没有办法自动将文件名设置为列名?