Docker - 在容器中运行SQL文件

3
任何尝试都失败了。 我在我的笔记本电脑上有一个大的SQL脚本,我想在我的Docker容器中运行它。 我认为我必须先复制它。
docker cp ./my_cool_script.sql container_mssql_1:/my_cool_script.sql

这似乎能够运行,而且没有任何成功或失败的提示,所以我假设它是正常的?

然后我尝试:

docker exec container_mssql_1 -u sa psql databasename sa -f /my_cool_script.sql

但是我只得到了:
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:262: starting container process caused "exec: \"-u\": executable file not found in $PATH"

有什么想法,或者有更好的方法来完成这个任务吗?这个文件相当大(30MB)。


1
{btsdaf} - Robin
这是一个一次性的本地操作,我会使用mssql来设置我的本地环境。 - user3437721
4个回答

2
您可以使用随 SQL Server 镜像一起提供的 sqlcmd 实用程序来完成此操作。确实需要先将脚本复制到容器中。
使用以下命令将脚本复制到容器中: docker cp script.sql <container_id|container_name>:/tmp/ 然后,在容器内部使用 sqlcmd 实用程序。 docker exec -it <container_id|container_name> /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <your_password> -i /tmp/script.sql sqlcmd 文档:https://learn.microsoft.com/en-us/sql/ssms/scripting/sqlcmd-run-transact-sql-script-files Docker 镜像:https://hub.docker.com/_/microsoft-mssql-server 在“2019-CU8-ubuntu-16.04”镜像上测试过,脚本大小约为 700MB。

2

https://docs.docker.com/engine/reference/commandline/exec/

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-u选项需要在容器名称之前。

docker exec -u sa container_mssql_1 psql databasename sa -f /my_cool_script.sql

这就是为什么它抱怨“在我的PATH中找不到名为-u的可执行文件”的原因。它认为您想运行一个名为-u的命令。


我得到了这个错误信息:"无法找到用户 sa: 在 passwd 文件中没有匹配条目。" - user3437721
{btsdaf} - Birchlabs
问问自己:我为什么要写“-u sa”?你期望有一个名为“sa”的用户存在吗?错误提示告诉你没有这样的用户。 - Birchlabs
你是不是在指 _PostgreSQL 用户_?docker exec -u 是指容器操作系统中的用户,并非 PostgreSQL 用户。 - Birchlabs
谢谢 - 这是 MSSQL 而不是 postgres。我试图使用 sa 帐户执行 SQL。 - user3437721
{btsdaf} - Birchlabs

0

如果你查看你的输出,你会发现docker试图运行的可执行文件是-u,这对应于您尝试设置用户-基本上您只是把docker命令参数放错了顺序!

试着将用户选项直接放在exec之后和容器名称之前...

docker exec -u sa container_mssql_1 psql databasename sa -f /my_cool_script.sql

你也许实际上不需要使用-u选项来明确指定用户。


0

使用 docker exec 命令时,您最终是在容器内执行命令。 docker exec 的语法为:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

根据您使用的命令,它将"-u"视为COMMAND,但在$PATH中找不到可执行文件。

我不是mssql或psql方面的专家,因此我不知道您在psql命令之前尝试使用-u sa实现什么目的。


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