Yiy*_*hen 11 sql-server sqlcmd docker azure-sql-edge
我正在使用配备 M1 CPU 的 MacBook Pro,因此无法使用“普通”mssql docker 映像。我使用的 azure-sql-edge 没有 sqlcmd 来初始化数据库(创建架构、数据库、登录)。
我创建了一个 sql 脚本,我想在容器启动后运行该脚本,但我找不到 sqlcmd 的任何替代方案。
还有其他方法吗?
小智 6
我遇到了同样的问题,我使用了 Microsoft 注册表中的 mssql-tools docker 映像。
示例 docker-compose:
---
version: '3.8'
services:
mssql:
image: mcr.microsoft.com/azure-sql-edge:latest
command: /opt/mssql/bin/sqlservr
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "SA_Passw0rd"
stdin_open: true
ports:
- 1433:1433
networks:
- db_net
sqlcmd:
image: mcr.microsoft.com/mssql-tools:latest
command: /opt/mssql_scripts/run-initialization.sh
stdin_open: true
volumes:
- ./mssql_scripts:/opt/mssql_scripts
networks:
- db_net
networks:
db_net:
name: db_net
Run Code Online (Sandbox Code Playgroud)
要使用此 docker-compose,您需要在文件夹run-initialization.sh
内有一个以执行权限命名的 shell 脚本mssql_scripts
。
该run-initialization.sh
脚本等待数据库启动,然后执行sql命令:
/opt/mssql-tools/bin/sqlcmd -S mssql -U SA -P SA_Passw0rd -d master -Q "SELECT version()"
test.sql
或者如果您想从文件执行:
/opt/mssql-tools/bin/sqlcmd -S mssql -U SA -P SA_Passw0rd -d master -i /opt/mssql_scripts/test.sql
由于我正在开始一个新项目,我再次研究了这个问题并为我找到了一个很好的解决方案。
我发现了go-sqlcmd,这是一个使用 golang 的 sqlcmd 的新实现,它与 M1 芯片兼容。
azure-sql-edge
所以我像以前一样使用 docker compose运行:
version: "3.9"
services:
mssql:
image: mcr.microsoft.com/azure-sql-edge:latest
command: /opt/mssql/bin/sqlservr
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: ${DATABASE_SA_PASSWORD}
stdin_open: true
ports:
- 1433:1433
Run Code Online (Sandbox Code Playgroud)
当数据库容器启动并处于空闲状态时,我运行此 bash 脚本(在我的例子中,我从 .NETappsettings.json
文件读取环境变量):
cat <appsetting.json> | jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' > temp
# Show env vars
grep -v '^#' temp
# Export env vars
export $(grep -v '^#' temp | xargs)
export SQLCMDPASSWORD=$DATABASE_SA_PASSWORD
sqlcmd -U sa \
-v DATABASE_SCHEMA=$DATABASE_SCHEMA \
-v DATABASE_DB_NAME=$DATABASE_DB_NAME \
-v DATABASE_LOGIN_NAME=$DATABASE_LOGIN_NAME \
-v DATABASE_LOGIN_PASSWORD=$DATABASE_LOGIN_PASSWORD \
-i sql/init-db.sql,sql/init-user.sql
Run Code Online (Sandbox Code Playgroud)
我必须在脚本中拆分数据库和架构创建,然后创建用户并将其分配给数据库。
SQL 脚本init-db.sql
:
USE master
IF NOT EXISTS (SELECT name FROM sys.schemas WHERE name = N'$(DATABASE_SCHEMA)')
BEGIN
EXEC sys.sp_executesql N'CREATE SCHEMA [$(DATABASE_SCHEMA)] AUTHORIZATION [dbo]'
END
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'$(DATABASE_DB_NAME)')
BEGIN
CREATE DATABASE $(DATABASE_DB_NAME)
END
Run Code Online (Sandbox Code Playgroud)
init-user.sql
:
USE $(DATABASE_DB_NAME)
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = '$(DATABASE_LOGIN_NAME)') BEGIN
CREATE LOGIN $(DATABASE_LOGIN_NAME)
WITH PASSWORD = '$(DATABASE_LOGIN_PASSWORD)'
END
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = '$(DATABASE_LOGIN_NAME)') BEGIN
CREATE USER $(DATABASE_LOGIN_NAME) FOR LOGIN $(DATABASE_LOGIN_NAME)
END
Run Code Online (Sandbox Code Playgroud)