首页 > 解决方案 > 借助 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 打开时执行命令。 执行我的脚本

标签: mysqlbashdockershellcontainers

解决方案


你可以试试这个:

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

推荐阅读