Sql server Docker在SQL Server中初始化数据库表和记录
如何使用SQL脚本文件通过Sql server Docker在SQL Server中初始化数据库表和记录,sql-server,docker,docker-compose,Sql Server,Docker,Docker Compose,如何使用SQL脚本文件通过docker compose为SQL Server指定初始化数据库脚本 docker compose.yml database: image: microsoft/mssql-server-linux:2017-latest container_name: database ports: - 1433:1433 volumes: - /var/opt/mssql environment: SA_
docker compose
为SQL Server指定初始化数据库脚本
docker compose.yml
database:
image: microsoft/mssql-server-linux:2017-latest
container_name: database
ports:
- 1433:1433
volumes:
- /var/opt/mssql
environment:
SA_PASSWORD: "P@55w0rd"
ACCEPT_EULA: "Y"
CREATE TABLE Department
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Student
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Course
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
INSERT INTO Student (Id, Name) VALUES(1, "John Doe");
INSERT INTO Student (Id, Name) VALUES(2, "Jane Doe");
schema.sql
database:
image: microsoft/mssql-server-linux:2017-latest
container_name: database
ports:
- 1433:1433
volumes:
- /var/opt/mssql
environment:
SA_PASSWORD: "P@55w0rd"
ACCEPT_EULA: "Y"
CREATE TABLE Department
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Student
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Course
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
INSERT INTO Student (Id, Name) VALUES(1, "John Doe");
INSERT INTO Student (Id, Name) VALUES(2, "Jane Doe");
如果您检查了,它建议使用像MySQL容器这样的容器
导入数据。sh
import-data.sh脚本是延迟执行的方便方法
在SQL Server启动之前,执行SQL命令的。通常是SQL Server
大约需要5-10秒才能启动并准备好连接和
命令
下一个命令使用SQL Server命令行实用程序sqlcmd
执行setup.SQL
文件中包含的一些SQL命令
setup.sql脚本将在默认dbo模式中创建一个名为DemoData的新数据库和一个名为Products的表
setup.sql
database:
image: microsoft/mssql-server-linux:2017-latest
container_name: database
ports:
- 1433:1433
volumes:
- /var/opt/mssql
environment:
SA_PASSWORD: "P@55w0rd"
ACCEPT_EULA: "Y"
CREATE TABLE Department
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Student
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
CREATE TABLE Course
(
Id INT PRIMARY KEY IDENTITY (1, 1),
Name VARCHAR (50) NOT NULL
);
INSERT INTO Student (Id, Name) VALUES(1, "John Doe");
INSERT INTO Student (Id, Name) VALUES(2, "Jane Doe");
setup.sql定义了一些简单的命令来创建数据库和一些简单的模式。您可以将这样的.sql文件用于其他应用程序
用于创建登录、分配权限、创建存储
程序等等。在生产环境中创建数据库时
在这种情况下,您可能需要更具体地说明
创建数据库文件,以便将数据库文件存储在
永久存储。此SQL脚本创建一个包含两列的表-
对于那些喜欢更多细节/例子的人。
正如@adii所建议的,这是在docker compose文件中初始化数据库的方法
docker-compose.yml
test-database:
build: ./mssql_database
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=<YOUR PASSWORD>
- TZ=UTC
volumes:
- database-data:/var/opt/mssql
volumes:
database-data:
entrypoint.sh
#!/usr/bin/env bash
set -m
./opt/mssql/bin/sqlservr & ./setup_database.sh
fg
setup_database.sh
注意:与其使用睡眠,不如使用健康检查,一旦数据库被确认为绿色,就运行脚本
#!/usr/bin/env bash
# Wait for database to startup
sleep 20
./opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P <YOUR PASSWORD> -i setup.sql
如果您确实使用docker compose而不仅仅是裸docker,请注意。 我的docker compose文件中的一个片段:
sql-server:
image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
hostname: sql-server
container_name: sql-server
ports:
- 1433:1433
# Based on: https://www.softwaredeveloper.blog/initialize-mssql-in-docker-container or similarly: https://github.com/twright-msft/mssql-node-docker-demo-app
command: bash -c "chmod -R 777 /usr/src/sql/ && /usr/src/sql/entrypoint.sh"
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Password123
MSSQL_PID: Express
volumes:
- ./sql/:/usr/src/sql/
现在,由于我没有使用定制的Dockerfile
,我显然没有弄乱workdir。当我跑步时:
docker inspect mcr.microsoft.com/mssql/server:2017-latest-ubuntu | grep -i "DIR"
我得到:
"WorkingDir": "",
"WorkingDir": "",
这意味着未设置working dir,因此默认情况下,您将进入容器内的根文件夹
这将使以下脚本无法运行:/opt/mssqltools/bin/sqlcmd-S localhost-U SA-p-i setup.sql
因为根目录中没有setup.sql。在这种情况下,需要指定绝对路径,如:
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -d master -i /usr/src/sql/setup.sql
GO语句的含义是什么,所以它必须在每个SQL语句之后进行吗?是的,它可能像脚本那样,但是我更喜欢检查回购文档,它们添加了90s的延迟,你不觉得太多了吗?他们也提到了这个原因,所以考虑它官方推荐是成功的,但是一旦执行下面的SQL命令,容器就会崩溃,
CREATE DATABASE DemoData;使用解调器;GO
我认为您需要将``卷:数据库数据:``添加到docker compose文件中,为了完整性,我可以添加它