gpt4 book ai didi

sql - 为什么 Docker 中的 MSSQL 在 sql 查询中返回 "The last operation was terminated because the user pressed CTRL+C"?

转载 作者:IT王子 更新时间:2023-10-29 00:34:16 26 4
gpt4 key购买 nike

我在 Archlinux 64x (4.17.4-1-ARCH) 上使用 Docker(版本 18.06.0-ce,构建 0ffa8257ec)。我正在使用 Microsoft's MSSQL docker 容器 CU7。每次我尝试输入查询或运行 SQL 文件时,我都会收到此警告消息:

Sqlcmd: Warning: The last operation was terminated because the user pressed CTRL+C.

然后当我用Datagrip 检入数据库时​​,查询还没有被执行!这是我的命令:

docker pull microsoft/mssql-server-linux:2017-CU7
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=GitGood*0987654321" -e "MSSQL_PID=Developer" -p 1433:1433 --name beep_boop_boop -d microsoft/mssql-server-linux:2017-CU7

# THIS

sudo echo "CREATE DATABASE test;" > /test.sql
docker exec beep_boop_boop /opt/mssql-tools/bin/sqlcmd -U SA -P GitGood*0987654321 < test.sql

# OR

docker exec beep_boop_boop /opt/mssql-tools/bin/sqlcmd -U SA -P GitGood*0987654321 -Q "CREATE DATABASE test;"

我的问题是如何避免在 MSSQL 查询中发出警告 operation was terminated by user 警告?

最佳答案

你应该使用 docker-compose ,我相信它会让你的生活更轻松。我的猜测是你在不知不觉中遇到了错误。第一次尝试时,我使用了不符合安全要求的不安全密码,并收到此错误:

ERROR: Unable to set system administrator password: Password validation failed. The password does not meet SQL Server password policy requirements because it is not complex enough. The password must be at least 8 characters long and contain characters from three of the following four sets: Uppercase letters, Lowercase letters, Base 10 digits, and Symbols..

我看到你的密码很安全,但请注意你的密码中有一个 *,如果没有正确转义,它可能会执行

或者使用命令行运行时服务器没有启动,例如:

# example of a failing attempt
docker run -it --rm -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=GitGood*0987654321' -p 1433:1433 microsoft/mssql-server-linux:2017-CU7 bash
# wait until you're inside the container, then check if server is running
apt-get update && apt-get install -y nmap
nmap -Pn localhost -p 1433

如果它没有运行,你会看到类似的东西:

Starting Nmap 7.01 ( https://nmap.org ) at 2018-08-27 06:12 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000083s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
1433/tcp closed ms-sql-s

Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds

介绍完毕,这是一个可行的解决方案:

docker-compose.yml

version: '2'
services:
db:
image: microsoft/mssql-server-linux:2017-CU7
container_name: beep-boop-boop
ports:
- 1443:1443
environment:
ACCEPT_EULA: Y
SA_PASSWORD: GitGood*0987654321

然后运行以下命令并等待图像准备就绪:

docker-compose up -d
docker-compose logs -f &
  • up -d 妖魔化容器,使其继续在后台运行。
  • logs -f 将读取日志并follow(类似于tail -f 所做的)
  • & 在后台运行命令,这样我们就不需要使用新的 shell

现在像这样在该容器内运行一个 bash:

docker-compose exec db bash

进入图像后,您可以运行命令

/opt/mssql-tools/bin/sqlcmd -U SA -P $SA_PASSWORD -Q "CREATE DATABASE test;"
/opt/mssql-tools/bin/sqlcmd -U SA -P $SA_PASSWORD -Q "SELECT name FROM master.sys.databases"

注意我是如何在这里重用 SA_PASSWORD 环境变量的,所以我不需要重新输入密码。

现在享受结果

name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
test

(5 rows affected)

为了正确设置,我建议用 docker-compose.yml 中的以下行替换 environment 键:

env_file:
- .env

这样,您可以将 secret 存储在 docker-compose.yml 之外,并确保您不会在版本控制中跟踪 .env(您应该将 .env 添加到您的 .gitignore 并在您的存储库中提供一个 .env.example 和适当的文档。

这是一个示例项目,它确认它在 Travis-CI 中工作:
https://github.com/GabLeRoux/mssql-docker-compose-example

其他改进

可能有一些其他的方法可以用一个衬里来完成这个,但是为了可读性,通常最好只使用一些脚本。在 repo 中,我采用了一些快捷方式,例如 run.sh 中的 sleep 10。这可以通过实际等待数据库以正确的方式启动来改进。初始化脚本也可以是 entrypoint.sh 等的一部分。希望它能帮助您入门 🍻

关于sql - 为什么 Docker 中的 MSSQL 在 sql 查询中返回 "The last operation was terminated because the user pressed CTRL+C"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com