Docker контейнер не запускается - PullRequest
2 голосов
/ 07 июня 2019

Создано простое приложение, которое подключается к PostgreSQL, но когда я его контейнеризовал с помощью Docker, я не могу запустить его, и при запуске контейнера не было показано ни одного порта / портов.В чем проблема?

Приложение работает без Docker, но когда я его контейнирую, возникает проблема.

docker build успешно, и когда я использую docker run

, он дает мне контейнер, но когда я проверяю его, используя docker ps -a, нет портов, где показано

Эточто я сделал на докерном терминале

и это мой код при подключении к PostgreSQL db

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();
    }
}

вот мой файл докера

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 голосов
/ 07 июня 2019
  1. Если вы используете Docker для Mac (или Docker для Windows), для доступа к чему-либо на хосте вам необходимо использовать host.docker.internal. Подробнее об этом здесь .
  2. Считать строку подключения из переменных конфигурации и окружения. Это позволит вам переопределить его при запуске контейнера.

PS: я новичок

Профессиональный совет для вас: p

Возможно, вы не захотите использовать -d для контейнера, с которым вы работаете, поэтому вы видите его журналы прямо там. Если бы вы не использовали его, вы бы увидели выход процесса и не задумывались, почему там нет показанного порта:)


UPDATE:

  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 для Windows или Docker для Mac. Не работает на Docker Toolbox или на Linux AFAIK.
  4. Теперь вам нужно выяснить, как ваше приложение должно использовать host.docker.internal при запуске в Docker и localhost в противном случае. Мое предложение состояло в том, чтобы прочитать это из конфигурации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...