带有自动 SSL 的 .NET Core Docker

Alg*_*thm 5 .net docker docker-compose lets-encrypt

我目前正致力于在服务器上部署 .NET Core Web api。我想使用 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";
        // ........
    }
    // ........
}
Run Code Online (Sandbox Code Playgroud)

MyDockerfile是非常标准的,因为 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"]
Run Code Online (Sandbox Code Playgroud)

我在我的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"
Run Code Online (Sandbox Code Playgroud)

这个docker-compose.yml文件在我的本地机器上工作得很好。当我想在服务器上部署它时,问题就出现了。网上有人制作了一个 docker-compose 文件,该文件运行 nginx 代理和容器,用于使用 Let's Encrypt ( jwilder/nginx-proxy)自动检索有效的 SSL 证书。

让它工作很容易。启动一个新的 docker 容器时,您只需要将其分配给正确的外部 docker 网络(在本例中为:)nginx-proxy,然后为其提供以下环境变量:

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

此外,您只需公开端口 80,而不是映射端口。然后当容器启动时,其他容器将自动获取 SSL 证书并为新启动的容器创建代理。

这里的问题是 Microsoft 的容器处理环境变量的方式。我的 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
Run Code Online (Sandbox Code Playgroud)

但是在运行时解决了以下错误docker-compose up

错误:Compose 文件 './docker-compose.yml' 无效,因为:services.restapi.environment contains {"VIRTUAL_HOST": "api.effortless.dk"},这是一个无效类型,它应该是一个字符串

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

Alg*_*thm 3

我想通了,幸运的是解决方案非常简单。我不知道为什么,但微软出于某种原因只是选择错误地格式化他们的环境。要解决此问题,只需使用=而不是:不使用空格:

(...)
environment:
   - DB_HOST=db
   - VIRTUAL_HOST=my_domain.com
   - LETSENCRYPT_HOST=my_domain.com
   - LETSENCRYPT_EMAIL=my@email.com
(...)
Run Code Online (Sandbox Code Playgroud)