.NET Core Docker с автоматическим SSL - PullRequest
0 голосов
/ 22 ноября 2018

В настоящее время я работаю над развертыванием веб-API .NET Core на сервере.Я хотел сделать это используя docker compose для легкого управления.В моем Startup.cs у меня есть этот код:

public class Startup
{
    public Startup (IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices (IServiceCollection services)
    {
        var databaseHost = Configuration["DB_HOST"] ?? "localhost";
        // ........
    }
    // ........
}

Мой Dockerfile довольно стандартен, поскольку документация Microsoft утверждает, что это должно быть:

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

# 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:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "ApiProject.dll"]

Я определяю свои переменные среды вмой docker-compose.yml файл:

version: '3'
services:
restapi:
    build:
    context: ./ApiProject
    dockerfile: Dockerfile
    depends_on:
    - db
    ports:
    - "5000:80"
    restart: always
    environment:
    - DB_HOST=db
db:
image: postgres
ports:
    - "5432:5432"
restart: always
environment:
    POSTGRES_USER: "root"
    POSTGRES_PASSWORD: "root"

Этот docker-compose.yml файл отлично работает на моей локальной машине.Проблема возникает, когда я хочу развернуть его на сервере.Кто-то в сети создал файл docker-compose, который запускает прокси-сервер nginx и контейнеры для автоматического получения действительных сертификатов SSL с помощью Let's Encrypt ( jwilder / nginx-proxy) .

Работать довольно просто.При запуске нового Docker-контейнера вам просто нужно назначить его правильной внешней Docker-сети (в данном случае: nginx-proxy), а затем присвоить ему следующие переменные среды:

  • VIRTUAL_HOST: example.com
  • LETSENCRYPT_HOST: example.com
  • LETSENCRYPT_EMAIL: myemail@example.com

Кроме того, вместо сопоставления портов вам просто нужно открыть порт 80. Затем, когда контейнер запускается,другие контейнеры будут автоматически получать сертификаты SSL и создавать прокси для вновь запущенного контейнера.

Проблема заключается в том, как контейнеры Microsoft работают с переменными среды.Контейнер для моего веб-API имеет несколько переменных среды, таких как DB_HOST=mydbhost.com.Затем он автоматически импортируется в код.Это означает, что я не могу добавить переменные среды (например, VIRTUAL_HOST: example.com), необходимые для правильной работы прокси-контейнеров.

Я попробовал следующую конфигурацию docker-compose.yml:

  version: '3'
  services:
    restapi:
      build:
        context: ./EffortlessApi
        dockerfile: Dockerfile
      depends_on:
        - db
      expose:
        - 80
      restart: always
      environment:
        - DB_HOST=db
        - VIRTUAL_HOST: my_domain.com
        - LETSENCRYPT_HOST: my_domain.com
        - LETSENCRYPT_EMAIL: my@email.com
    db:
    image: postgres
    ports:
      - "5432:5432"
    restart: always
    environment:
      POSTGRES_USER: "root"
      POSTGRES_PASSWORD: "root"
  networks:
    default:
      external:
        name: nginx-proxy

Но это решилось следующей ошибкой при запуске docker-compose up:

ОШИБКА:Файл Compose './docker-compose.yml' недопустим, потому что: services.restapi.environment содержит {"VIRTUAL_HOST": "api.effortless.dk"}, что является недопустимым типом, это должна быть строка

Я совершенно заблудился, как мне решить эту проблему.Я хочу легко развернуть и управлять несколькими контейнерами с действительными сертификатами SSL, и эта настройка довольно классная, если только она работает и с проектом .NET.

1 Ответ

0 голосов
/ 14 января 2019

Я все понял, решение, к счастью, было довольно простым.Я не знаю почему, но Microsoft по какой-то причине просто выбрала неправильное форматирование среды.Чтобы это исправить, просто используйте = вместо : без пробела:

(...)
environment:
   - DB_HOST=db
   - VIRTUAL_HOST=my_domain.com
   - LETSENCRYPT_HOST=my_domain.com
   - LETSENCRYPT_EMAIL=my@email.com
(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...