docker - 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 应用程序没有在同一个容器上运行?. 我想先运行数据库脚本,然后启动服务
解决方案
下面的过程将允许您创建数据库和许多其他内容,包括数据库播种:
码头工人撰写:
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
推荐阅读
- angular - 如何将数据绑定到angular2中的primeng表
- wordpress - 必需的自定义 WooCommerce 复选框结帐字段不会自行验证
- ios - 如何创建具有边距、圆角和阴影的 UITableView?
- javascript - 在 ruby on rails 5 应用程序中使用具有 Materialize Css 和简单表单的 cocoon Gem 时出现 Datepicker 问题
- ios - 为什么 UILabel 在故事板中设置时会失去突出显示的状态?
- scala - 在 Spark SQL 中使用 UDF 函数后,如何修复这种类型的错误?
- typescript - 泛型类部分初始化器
- java - 使用 sharedPreferences 保存和加载微调器值
- python - Dialogflow Slack 事件
- python - k-hot 对来自多列的值进行编码