具有自动SSL的.NET Core Docker
我目前正在服务器上部署.NET核心web api。为了便于管理,我想使用docker compose。在my具有自动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; }
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
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
(...)