Docker容器无法启动

3

我创建了一个连接到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"]

但我无法运行它。以下是屏幕截图

在此输入图片描述

非常感谢任何帮助! PS:我是新手。


1
“Host=localhost;” - 可能您的Postgres实例也在同一个Docker容器中运行(即容器看到的是“localhost”)? - ProgrammingLlama
我的意思是容器中的 localhost = 这个容器,而不是物理机器。 - ProgrammingLlama
@zero298 不是。我正在连接主机。刚刚编辑了我的帖子并添加了Dockerfile。 - tad00
你是否在Docker中运行Postgres? - ProgrammingLlama
连接到主机db并不容易。您可以尝试切换到主机网络以适应您的情况。请参阅此问题以了解其他人使用的选项。停止的容器没有端口,但是可以通过docker logs $container_id查看日志。 - BMitch
显示剩余6条评论
1个回答

0
  1. 如果您正在使用Docker for Mac(或Docker for Windows),要访问主机上的任何内容,您需要使用host.docker.internal。更多信息请参见此处
  2. 从配置和环境变量中读取连接字符串。这将允许您在运行容器时进行覆盖。

附言:我是新手

给您一个专业提示 :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
    

    只有在使用Docker for Windows或Docker for Mac时才有效。在Docker Toolbox或Linux上不起作用。
  4. 现在,您需要找出一种方法,使应用程序在运行时在docker内部使用host.docker.internal,否则使用localhost。我的建议是从配置文件中读取它。

抱歉回复晚了。当我改变了 Docker 文件后,我能够显示端口号,但无法运行,因为它报错了:“Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: "./webapplication1": stat ./webapplication1: no such file or directory": unknown.” - tad00
@tad00 我已更新我的答案... 你是否在使用Docker工具箱? - galdin
好的我要试试这个。是的我使用了Docker工具箱而不是Docker for Windows,因为它是唯一免费的。 - tad00
@tad00 Docker for Windows是免费的,但需要Windows 10专业版。 - galdin
哦,好的,但是我的操作系统现在是Windows 10家庭版。无论如何,我尝试使用docker run -p 8080:80 --name test webapplication1,但它只输出这个消息:“您是否想运行dotnet SDK命令?请从以下链接安装dotnet SDK: https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409” - tad00
@tad00 你确定入口点是 dotnet appname.dll 吗?如果你使用 dotnet run,它需要 SDK,但是直接使用 DLL 不需要 SDK,只需要运行时。 - galdin

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