Docker容器无法启动

时间:2019-06-07 14:51:55

标签: c# postgresql docker asp.net-core

创建了一个连接到PostgreSQL的简单应用程序,但是当我使用Docker对其进行容器化时,我似乎无法启动它,并且在运行容器时未显示任何端口。似乎是什么问题?

该应用程序无需Docker就可以运行,但是当我对其进行容器化时,这就是问题所在。

docker build成功,当我使用docker run

它给了我一个容器,但是当我使用docker ps -a检查它时,没有显示端口

这就是我在docker终端上所做的

这是我连接到PostgreSQL数据库时的代码

class Program
{
    static void Main(string[] args)
    {
        using (var connection = new NpgsqlConnection("Host=localhost;Username=postgres;Password=password;Database=user"))
        {
            connection.Open();
            connection.Execute("Insert into customer (name) values ('Mikolasola');");
            var value = connection.Query<string>("Select name from customer;");
            Console.WriteLine(value.First());
        }

        Console.Read();
    }
}

这是我的docker文件

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "webapplication1.dll"]

编辑:将我的Docker文件更改为此,现在我可以通过某种方式获取端口

FROM microsoft/dotnet:2-sdk AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -r linux-x64 -o out

FROM microsoft/dotnet:2-runtime-deps
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["./webapplication1"]

但是我不能运行它。这是屏幕截图

enter image description here

任何帮助将不胜感激。谢谢! PS:我是新手

1 个答案:

答案 0 :(得分:0)

  1. 如果您使用的是Mac的Docker(或Windows的Docker),则要访问主机上的任何内容,都需要使用host.docker.internal。有关here的更多信息。
  2. 从config和环境变量中读取连接字符串。这样您就可以在运行容器时覆盖它。
  

PS:我是新手

专业提示:p

您可能不想在正在使用的容器上使用-d,因此您会在此处看到日志。如果您不使用它,您将看到进程退出,并且不知道为什么那里没有显示端口:)


更新:

  1. 使用原始问题中的Dockerfile(在编辑之前)。
  2. 我建议您在不使用-d的情况下运行它:
    docker run -p 8080:80 --name test webapp1
    
    这将向您显示aspnet应用程序崩溃。您会看到发生了什么事。在这种情况下,由于我知道发生了什么事,我可以提供帮助,但总的来说,您想知道发生了什么事。您可以通过以下方式来做到这一点:不对诸如此类的小事情在分离状态下运行它,并在需要解析的地方使用docker logs。反正...
  3. ...您希望容器访问主机上的数据库,而不是其本地主机上的数据库。您可以使用host.docker.internal作为主机来执行此操作。例如:
    Host=host.docker.internal;Username=postgres;Password=password;Database=user
    
    仅当您使用Windows的Docker或Mac的Docker时,这才有效。在Docker Toolbox或Linux AFAIK上不起作用。
  4. 现在,您需要弄清楚应用程序在docker中运行时使用host.docker.internal的方式,否则要使用localhost。我的建议是从config读取它。