首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有自动SSL的.NET核心码头

具有自动SSL的.NET核心码头
EN

Stack Overflow用户
提问于 2018-11-22 14:19:11
回答 1查看 2.2K关注 0票数 5

我目前正致力于在服务器上部署.NET核心web。为了便于管理,我想用码头构图来完成它。在我的Startup.cs中,我有以下代码:

代码语言:javascript
复制
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非常标准,正如微软的文档所述:

代码语言:javascript
复制
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文件中定义了环境变量:

代码语言:javascript
复制
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文件在我的本地机器上工作得很好。当我想在服务器上部署它时,问题就出现了。一些在线用户已经制作了一个坞-撰写文件,它运行一个nginx代理和容器,使用“让我们加密”((jwilder/nginx-代理) )自动检索有效的SSL证书。

让它起作用是相当容易的。启动新的码头容器时,只需将其分配给正确的外部停靠网络(在本例中为:nginx-proxy),然后给它提供以下环境变量:

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

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

这里的问题是微软的容器处理环境变量的方式。我的web的容器本身有一些环境变量,比如DB_HOST=mydbhost.com。然后它将自动导入到代码中。这意味着我无法添加代理容器正常工作所需的环境变量(即VIRTUAL_HOST: example.com)。

我试用了以下docker-compose.yml配置:

代码语言:javascript
复制
  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-come.yml’无效,因为: services.restapi.environment包含{"VIRTUAL_HOST":"api.effortless.dk"},这是一个无效的类型,它应该是一个字符串

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 19:49:54

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

代码语言:javascript
复制
(...)
environment:
   - DB_HOST=db
   - VIRTUAL_HOST=my_domain.com
   - LETSENCRYPT_HOST=my_domain.com
   - LETSENCRYPT_EMAIL=my@email.com
(...)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53432945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档