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了。