不使用 sqlcmd 在 docker 容器中初始化 SQL Server 数据库

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


Yiy*_*hen 1

由于我正在开始一个新项目,我再次研究了这个问题并为我找到了一个很好的解决方案。

我发现了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)