docker-compose中完全启动sql server后执行初始化脚本添加用户和表

目的:mcr.microsoft.com/mssql/server:2019-latest up会安装好mssql,我需要在启动完成后自动运行一些脚本来添加创建数据库、用户、表以及插入表数据。

mysql和oracle都提供了一个入口,只要把想要执行的.sh和.sql文件放到某个文件夹中,docker container启动后会自动创建,但是sqlserver并没有提供这个入口,我们只能通过其他的方法来实现。

如果只需要mssql,只用创建一个docker-compose.xml就可以了,内容如下:

version: '3.1'

services:
     
  mssql-2019:  
    image: mcr.microsoft.com/mssql/server:2019-latest
    restart: always
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Password
    volumes:
      - "./db-server/mssql-2019/init:/docker-entrypoint-initdb.d/" 
    ports:
      - "1433:1433"

如果需要在mssql启动之后自动创建数据库之类的,就需要执行以下步骤:

1. 创建Dockerfile, 内容如下:

FROM mcr.microsoft.com/mssql/server:2019-latest

ARG SA_PASSWORD="mydbpassword"
ENV SA_PASSWORD=$SA_PASSWORD
ENV ACCEPT_EULA="Y"

EXPOSE 1433

RUN mkdir -p /usr/work
COPY ./*.sql /usr/work/

WORKDIR /usr/work

RUN ( /opt/mssql/bin/sqlservr & ) \
    | grep -q "Service Broker manager has started" \
    && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -i mssql_users.sql \
    && pkill sqlservr

2. 在Dockerfile同级目录下,创建mssql_users.sql,里面包含我们需要的执行创建用户之类的sql语句。为了方便,我把这几个文件都放在同一个目录下。注意,这里有不同的地方要用到mssql的密码,要保持一致。mssql_users.sql内容如下:

/*create db and schema*/
use master;    -- switch to master, then we can drop mydb db.
drop database if exists mydb;
create database mydb;
GO
use mydb;
GO
create schema joe;
GO

--create user with login
--注意sa和mydb_test的密码不同。sa的密码参见docker-compose.yml
drop user if exists mydb_test;
CREATE LOGIN mydb_test   
    WITH PASSWORD = 'mydbpassword';  
USE mydb;  
CREATE USER mydb_test FOR LOGIN mydb_test   
    WITH DEFAULT_SCHEMA = joe;
EXEC sp_addrolemember 'db_ddladmin', N'mydb_test';
GRANT CONTROL ON DATABASE::mydb TO mydb_test;
GO

3. 还是在同一级目录下创建docker-compose.yml文件,内容如下:

version: '3.8'

services:
    db:
        container_name: sql_server_db
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - '1433:1433'

4. 执行如下命令

docker-compose -f docker-compose.yml up -d --force-recreate --build db

5. 等待执行完成,我们用一个通用的数据库连接工具,就可以用 mydb_test:mydbpassword来连接数据库mydb了。

我这是从网上抄的例子,现在附上其链接

https://www.ankursheel.com/blog/run-sql-server-docker-container

之前倒是想过用cmd和entrypoint里达到这个目的,一直未成功,总是找不到合适的实际来执行sql语句。https://www.ankursheel.com/blog/run-sql-server-docker-container 这里的例子提供了一个很好的方法,用/opt/mssql/bin/sqlservr启动mssql,找到Service Broker manager has started表示mssql已经启动完成,这个时候就可以执行/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -i mssql_users.sql了。

 

posted @ 2022-07-15 14:45  panda4671  阅读(1808)  评论(1编辑  收藏  举报