В настоящее время я работаю над развертыванием веб-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.