Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Docker在SQL Server中初始化数据库表和记录_Sql Server_Docker_Docker Compose - Fatal编程技术网

Sql server Docker在SQL Server中初始化数据库表和记录

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_

如何使用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_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文件中,为了完整性,我可以添加它