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 项目,这个设置非常酷。
我想通了,幸运的是解决方案非常简单。我不知道为什么,但微软出于某种原因只是选择错误地格式化他们的环境。要解决此问题,只需使用=
而不是:
不使用空格:
(...)
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)
归档时间: |
|
查看次数: |
1744 次 |
最近记录: |