首页 > 解决方案 > Docker - ASP.NET Core 和 SQL Server 脚本

问题描述

我正在尝试在基于 nginx Linux 的容器上使用 ASP.NET Core 和 SQL Server。

我想运行数据库脚本来创建我的表,但我不知道该怎么做。它失败了,并且通过 ENTRY POINT 启动了服务,该服务甚至在 SQL Server 启动之前和脚本执行之前就被执行。

如何在同一个容器中安装 ASP.NET Core 和 SQL Server 映像?

我的码头文件:

FROM microsoft/dotnet:2.1-sdk  AS build
WORKDIR /build
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o output
FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY --from=build /build/output .
COPY entrypoint.sh entrypoint.sh
COPY SqlCmdStartup.sh SqlCmdStartup.sh
COPY 01-createSpeakerTable.sql 01-createSpeakerTable.sql
COPY 02-createSponsorTable.sql 02-createSponsorTable.sql
RUN chmod +x SqlCmdStartup.sh
RUN chmod +x entrypoint.sh
CMD ["/bin/bash","entrypoint.sh"]
#CMD /bin/bash entrypoint.sh
ENTRYPOINT["dotnet","ConferenceApp.dll"]

入口点.sh:

/opt/mssql/bin/sqlservr & SqlCmdStartup.sh

SqlCmdStartup.sh:

sleep 20s
export STATUS=0
i=0
while [[ $STATUS -eq 0 ]] || [[ $i -lt 30 ]]; do
    sleep 1
    i=$i+1
    STATUS=$(grep 'Server setup is completed' /var/opt/mssql/log/setup*.log | wc -l)
done

/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Your_password123 -d master -i 01-createSpeakerTable.sql

createSpeakerTable.sql:

GO
Create DATABASE [DockerDBTest]
GO
USE [DockerDBTest]
GO

/****** Object:  Table [dbo].[Speakers]    Script Date: 13/10/2018 12:41:44 ******/
DROP TABLE IF EXISTS [dbo].[Speakers]
GO

/****** Object:  Table [dbo].[Speakers]    Script Date: 13/10/2018 12:41:44 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Speakers](
    [Id] [int] NULL,
    [First] [varchar](50) NULL,
    [Last] [varchar](50) NULL,
    [EmailAddress] [varchar](255) NULL
) ON [PRIMARY]
GO

的 docker-compose.yml

version: '3'

services :
 api:
   image: conference/api
   container_name: conference_api
   build:
    context: .
   ports:
   - 5000:80
   environment:
     ASPNETCORE_ENVIRONMENT: Production
   depends_on :
    - db
 db:
   image: "microsoft/mssql-server-linux"
   environment:
           SA_PASSWORD: "Your_password123"
           ACCEPT_EULA: "Y"
           MSSQL_PID: Developer
   ports:
    - 5432:5432
    - 1433:1433

当我尝试运行时,它说 /opt/mssql/bin/sqlservr not found 并且它没有创建 DBase 和 Table

我的 sql server 和 asp.net 应用程序没有在同一个容器上运行?. 我想先运行数据库脚本,然后启动服务

标签: dockerdocker-composedockerfile

解决方案


下面的过程将允许您创建数据库和许多其他内容,包括数据库播种:

码头工人撰写:

version: "3.7"
services:
  db:
    container_name: "${COMPOSE_PROJECT_NAME}_db"
    image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
    environment:
     - ACCEPT_EULA=Y
     - SA_PASSWORD=<sa user password here>
     - MSSQL_PID=Developer
    volumes:
      - ./sqlserver-logs:/var/opt/mssql/log
      
      # Make sure the script contains valid Unix line endings only
      - ./sqlserver/sqlserver_init.sh:/sqlserver_init.sh
      - ./sqlserver/create_database.sql:/create_database.sql
    ports:
      - 1433:1433
    entrypoint: /opt/mssql/bin/nonroot_msg.sh
    command: /sqlserver_init.sh

sqlserver_init.sh:

#!/bin/bash
set -x

###################################################################
# Remember to save this file in LF (Unix) line format (no \r)
###################################################################

echo "Starting the SQL Server in the background"
/opt/mssql/bin/sqlservr &
BACKGROUND_WORKER_PID=$!

echo "Waiting for the SQL Server to start"
until /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q "select 1"
do
  echo "Waiting for the SQL Server to start"
done

echo "Initializing db"
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -d master -i /create_database.sql

# Do not exit the docker image
wait $BACKGROUND_WORKER_PID

create_database.sql:

USE master
GO

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = '<your db name>')
BEGIN
  CREATE DATABASE <your db name>;
END;
GO

推荐阅读