Как я могу получить доступ к своему основному приложению docker asp.net? - PullRequest
0 голосов
/ 17 апреля 2019

У меня ASP.NET Core 2.2./PostgreSQL, составленное решение для докера, которое, кажется, отлично работает среди контейнеров.

Я следовал за гибридом официального Quickstart: Compose и ASP.NET Core с SQL Server и Быстрый старт: Compose и Django с решением для добавления node.js в микс.

В целях краткости я приведуопущено фактическое значение Dockerfile в этом посте. Dockerfile должно быть вполне стандартным:

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

RUN curl -sL https://deb.nodesource.com/setup_10.x |  bash -
RUN apt-get install -y nodejs

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 80/tcp
EXPOSE 5001/tcp
RUN chmod +x ./entrypoint.sh
CMD /bin/bash ./entrypoint.sh

, где entrypoint.sh фактически запускает веб-сервер и переносит EF-миграции следующим образом:

#!/bin/bash

set -e
run_cmd="dotnet run"

until dotnet ef database update; do
>&2 echo "PostgreSQL Server is starting up"
sleep 1
done

>&2 echo "PostgreSQL Server is up - executing command"
exec $run_cmd

и, наконец, мой docker-compose.yml выглядит следующим образом:

version: '3.4'

networks:
  aspnetpostgresql:
    driver: bridge

services:
  db:
    image: postgres
    restart: always
    networks: 
      - aspnetpostgresql
  web:
    build: .
    ports:
        - "5001:5001"
        - "5000:5000"
    depends_on:
        - db
    networks: 
      - aspnetpostgresql

Образ ASP.NET Core основан на mcr.microsoft.com/dotnet/core/sdk:2.2.Достаточно сказать, что у меня есть два контейнера: my_web_app_db_1 (PostgreSQL) и my_web_app_web_1 (ASP.NET Core 2.2. React Web App).Я вошел в my_web_app_web_1 -контейнер и установил, что веб-сервер работает на https://localhost:5001:

root@0123456780:/app# wget -p --no-check-certificate https://localhost:5001
--2019-04-17 19:46:29--  https://localhost:5001/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:5001... connected.
WARNING: The certificate of 'localhost' is not trusted.
WARNING: The certificate of 'localhost' hasn't got a known issuer.
HTTP request sent, awaiting response... 200 OK
Length: 1673 (1.6K) [text/html]
Saving to: 'localhost:5001/index.html'

localhost:5001/index.html                100%[==================================================================================>]   1.63K  --.-KB/s    in 0s      

# .... yada yada yada

FINISHED --2019-04-17 19:46:30--
Total wall clock time: 0.4s
Downloaded: 4 files, 3.2M in 0.1s (23.3 MB/s)

Другими словами, все выглядит нормально на стороне веб-сервера.

ABCDE-MacBook-Pro:MyWebApp MY_USER$ docker-compose ps
      Name                    Command               State                           Ports                         
------------------------------------------------------------------------------------------------------------------
my_web_app_db_1    docker-entrypoint.sh postgres    Up      5432/tcp                                              
my_web_app_web_1   /bin/sh -c /bin/bash ./ent ...   Up      0.0.0.0:5000->5000/tcp, 0.0.0.0:5001->5001/tcp, 80/tcp

Обратите внимание: порт 5001 также открыт для хоста, как видно по прокрутке вправо.

Однако все попытки подключенияс https://localhost:5001 безуспешно.Например, выполнение той же операции wget с хоста дает

ABCDE-MacBook-Pro:MyWebApp MY_USER$ wget -p --no-check-certificate https://localhost:5001
--2019-04-17 23:00:05--  https://localhost:5001/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:5001... connected.
Unable to establish SSL connection.

Выполнение операции curl одинаково неудачно:

ABCDE-MacBook-Pro:MyWebApp MY_USER$ curl -k https://localhost:5001curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to localhost:5001 

Наконец, я знаю, что aspnetcore -image неотъемлемо связан с портом 80:

Это изображение устанавливает переменную среды ASPNETCORE_URLS равной http://+:80, что означает, что если у вас нет explicity, установитеURL в вашем приложении, например, через app.UseUrl в вашем Program.cs, тогда ваше приложение будет прослушивать порт 80 внутри контейнера.

Однако, похоже, это не такмне, так как я могу wget портировать 5001.Либо это не относится к образу SDK, либо документация не обновлена.

Вопрос в том, что мне нужно сделать, чтобы получить доступ к https://localhost:5001 с хоста?

Обновление:

Моя цель с этой настройкой состояла в том, чтобы получить базу данных, которая будет создана и заполнена в соответствии с миграциями инфраструктуры сущностей db.Получившаяся конфигурация докера была предназначена для использования ранними тестировщиками, поэтому соображения относительно крупномасштабного производства не применимы.

Я довольно агностик, когда речь идет о точных механизмах инициации БД, но пока разработкаЯ далек от завершения, мое требование состояло в том, чтобы схема была легко обслуживаемой, а миграции легко развертывались.Таким образом, было бы удобно, если бы я мог выполнить команду

dotnet ef database update

, поскольку это точно то же самое, что я делал бы в своей среде разработки.После дальнейшего изучения моей первоначальной попытки докеризации моего проекта я решил сделать шаг назад и запустить фактические миграции из самого проекта ASP.NET Core.Возможно, это не самое чистое решение, но оно решает мою реальную проблему, а именно: наличие настройки докера, копирующей мою среду разработки.Для тех, кто заинтересован, мой Dockerfile теперь выглядит следующим образом:

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

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build-env /app/out . 

EXPOSE 80/tcp

ENTRYPOINT ["dotnet", "MyWebApp.dll"]

И DbContext выглядит так:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
        Database.Migrate();
    }

    // ...

}

docker-compose.yml почти так же, какдо этого (хотя я удалил конфигурацию сети).Теперь я могу получить доступ к http://localhost:8000 с главного компьютера.

1 Ответ

0 голосов
/ 18 апреля 2019

Поскольку вы не опубликовали Dockerfile, я не могу сказать наверняка, но есть ли у вас "EXPOSE 5001" в вашем Dockerfile? Возможно, если этого не будет, это приведет к такому поведению.

...