在Docker容器上执行SQL脚本

44

我有一个运行着mysql的docker容器,我想将一个.sql文件推送到该容器,并让mysql执行其中的命令。第一步相当简单:

docker cp ./dummy.sql <container_id>:/

接下来我要尝试从命令行中运行mysql,并指向我刚刚推送到容器中的文件。

docker exec <container_id> mysql -u root -ppassword < /dummy.sql

这个命令似乎试图在本地将/sample.sql作为stdin,而不是在容器中。我也尝试在容器ID后面加上引号,但似乎也不起作用。

我还尝试将命令放入一个.sh文件中并将其推送到Docker容器中,然后只需执行该文件,但这不太理想,并且也没有起作用。有什么建议吗?

3个回答

37

如果您要在命令中执行管道重定向,请将其作为字符串传递给/bin/sh

docker exec <container_id> /bin/sh -c 'mysql -u root -ppassword </dummy.sql'

31

无需先复制脚本。如果脚本在主机上,则:

docker exec -i <container_name> mysql -u root -ppassword <mydb> < /path/to/script.sql

或者如果“Use db”指令包含在脚本内:

docker exec -i <container_name> mysql -u root -ppassword < /path/to/script.sql

2
你不需要使用 -ecat。只需使用 docker exec -i <container_name> mysql -u root -ppassword < /path/to/script.sql 即可,假设脚本在主机上。 - Keenan

1

尝试:

docker exec <container_id> 'mysql -u root -ppassword </dummy.sql'

我提到尝试过,但我使用了双引号而不是单引号。我会在有机会时尝试使用单引号。当我那样做时,似乎docker试图以某种原因执行整个字符串作为一个文字命令。 - Akron
@Akron 如果没有引号,bash 将在调用 docker 之前解释字符串(并将虚拟值传递给 stdio)。 - Andrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接