Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 Asp.Net核心&x2B;Docker上的SQL Server-用于启动数据库的睡眠_Sql Server_Entity Framework_Docker_Asp.net Core_Docker Compose - Fatal编程技术网

Sql server Asp.Net核心&x2B;Docker上的SQL Server-用于启动数据库的睡眠

Sql server Asp.Net核心&x2B;Docker上的SQL Server-用于启动数据库的睡眠,sql-server,entity-framework,docker,asp.net-core,docker-compose,Sql Server,Entity Framework,Docker,Asp.net Core,Docker Compose,我注意到,当我第一次尝试运行docker compose up命令时,出现了一个错误: Starting mssql ... Starting mssql ... done Recreating api ... Recreating api ... done Attaching to mssql, api api exited with code 1 因为api试图从DB获取数据,但MSSQL尚未启动 所以,我的问题是,是否可以以某种方式等待DB,然后运行API 这是我的docker comp

我注意到,当我第一次尝试运行docker compose up命令时,出现了一个错误:

Starting mssql ...
Starting mssql ... done
Recreating api ...
Recreating api ... done
Attaching to mssql, api
api exited with code 1
因为api试图从DB获取数据,但MSSQL尚未启动

所以,我的问题是,是否可以以某种方式等待DB,然后运行API

这是我的docker compose和dockerfile

docker compose: 版本:“3.3”

服务:

  api:
    image: api
    container_name: api
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:80"
    depends_on:
      - db
  db:
    image: "microsoft/mssql-server-linux"
    container_name: mssql
    environment:
        SA_PASSWORD: "testtest3030!"
        ACCEPT_EULA: "Y"
        MSSQL_PID: "Express"
    ports:
      - "8001:1433"
dockerfile:

# Build Stage
FROM microsoft/aspnetcore-build as build-env
WORKDIR /source
COPY . .
RUN dotnet restore
RUN dotnet publish -o /publish --configuration Release

# Publish Stage
FROM microsoft/aspnetcore
WORKDIR /app
COPY --from=build-env /publish .
ENTRYPOINT ["dotnet", "Api.dll"]
我在日志中也注意到:

2017-11-17 22:12:42.67 Logon       Error: 18456, Severity: 14, State: 38.
2017-11-17 22:12:42.67 Logon       Login failed for user 'sa'. Reason: Failed to open the explicitly specified database 'MyDb'. [CLIENT: 172.26.0.3]
您可以使用一个简单的entrypoint.sh脚本:

docker文件将相应更改:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-bionic AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY ["src/entrypoint.sh", ""]
RUN chmod +x entrypoint.sh

# .... here your copy/restore/build/publish

ENTRYPOINT [ "/bin/bash", "entrypoint.sh" ]

你找到解决办法了吗?我可能面临着同样的问题,我个人所做的就是将应用程序和数据库服务分开。因此,首先以守护程序模式启动DB服务,它们始终保持运行。之后,您可以根据需要多次重新启动任何应用程序容器,并始终启动和运行DB。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-bionic AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY ["src/entrypoint.sh", ""]
RUN chmod +x entrypoint.sh

# .... here your copy/restore/build/publish

ENTRYPOINT [ "/bin/bash", "entrypoint.sh" ]