具有自动SSL的.NET Core Docker

具有自动SSL的.NET Core Docker,.net,docker,docker-compose,lets-encrypt,.net,Docker,Docker Compose,Lets Encrypt,我目前正在服务器上部署.NET核心web api。为了便于管理,我想使用docker compose。在myStartup.cs中,我有以下代码: public class Startup { public Startup (IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }

我目前正在服务器上部署.NET核心web api。为了便于管理,我想使用docker compose。在my
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代理和容器,用于使用Let's Encrypt()自动检索有效的SSL证书

启动新docker容器时,只需将其分配到正确的外部docker网络(在本例中:
nginx proxy
),然后为其提供以下环境变量:

  • 虚拟主机:example.com
  • LETSENCRYPT\u主机:example.com
  • LETSENCRYPT\u电子邮件:myemail@example.com
此外,您不需要映射端口,只需公开端口80。然后,当容器启动时,其他容器将自动获取SSL证书,并为新启动的容器创建代理

这里的问题是Microsoft容器处理环境变量的方式。my web 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
时,以下错误解决了这一问题:

错误:合成文件“./docker Compose.yml”无效,因为: services.restapi.environment包含{“虚拟主机”: “api.effortless.dk”},这是一个无效类型,它应该是一个字符串


我完全不知道该如何解决这个问题。我想用有效的SSL证书轻松地部署和管理多个容器,而且这个设置非常酷,如果它也能与.NET项目一起使用的话。

我完全明白了,幸运的是,解决方案非常简单。我不知道为什么,但Microsoft出于某种原因选择了f或将其环境设置为错误。要解决此问题,只需使用
=
而不是
而不使用空格:

(...)
environment:
   - DB_HOST=db
   - VIRTUAL_HOST=my_domain.com
   - LETSENCRYPT_HOST=my_domain.com
   - LETSENCRYPT_EMAIL=my@email.com
(...)