ASP.NET Core + SQL Server在Docker上 - 启动数据库时进行延迟

5
我发现当我第一次尝试运行docker-compose up命令时,会出现错误:
Starting mssql ...
Starting mssql ... done
Recreating api ...
Recreating api ... done
Attaching to mssql, api
api exited with code 1

由于API尝试从数据库获取数据,但MSSQL尚未启动。

那么,我的问题是是否有可能等待数据库,然后运行API?

这是我的docker-compose和dockerfile文件内容:

Docker-compose:

version:'3.3'

services:

  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]

你解决了这个问题吗?我可能面临着相同的问题。 - Jalal El-Shaer
我个人的做法是将应用程序和数据库服务分开。首先以守护进程模式启动数据库服务,使其始终保持运行状态。然后,您可以随意重启任何应用程序容器,而数据库始终处于运行状态。 - Ahmet
1个回答

0
您可以使用一个简单的 entrypoint.sh 脚本:
#!/bin/bash

set -e

run_cmd="dotnet your_app.dll"

sleep 10

exec $run_cmd

而 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" ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接