gpt4 book ai didi

带有自动 SSL 的 .NET Core Docker

转载 作者:行者123 更新时间:2023-12-01 12:26:01 25 4
gpt4 key购买 nike

我目前正致力于在服务器上部署 .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";
// ........
}
// ........
}

我的 Dockerfile是非常标准的,正如微软的文档所说,它应该是:
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 ( jwilder/nginx-proxy) .

让它工作很容易。当启动一个新的 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

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

    ERROR: The Compose file './docker-compose.yml' is invalid because: services.restapi.environment contains {"VIRTUAL_HOST": "api.effortless.dk"}, which is an invalid type, it should be a string



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

    最佳答案

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

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

    关于带有自动 SSL 的 .NET Core Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53432945/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com