我目前正致力于在服务器上部署.NET核心web。为了便于管理,我想用码头构图来完成它。在我的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文件在我的本地机器上工作得很好。当我想在服务器上部署它时,问题就出现了。一些在线用户已经制作了一个坞-撰写文件,它运行一个nginx代理和容器,使用“让我们加密”((jwilder/nginx-代理) )自动检索有效的SSL证书。
让它起作用是相当容易的。启动新的码头容器时,只需将其分配给正确的外部停靠网络(在本例中为:nginx-proxy),然后给它提供以下环境变量:
VIRTUAL_HOST: example.comLETSENCRYPT_HOST: example.comLETSENCRYPT_EMAIL: myemail@example.com此外,您只需公开端口80,而不是映射端口。然后,当容器启动时,其他容器将自动获得SSL证书,并对新启动的容器进行代理。
这里的问题是微软的容器处理环境变量的方式。我的web的容器本身有一些环境变量,比如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-come.yml’无效,因为: services.restapi.environment包含{"VIRTUAL_HOST":"api.effortless.dk"},这是一个无效的类型,它应该是一个字符串
我完全不知道该如何解决这个问题。我想使用有效的SSL证书轻松地部署和管理多个容器,这个设置非常酷,如果它也适用于.NET项目的话。
发布于 2019-01-14 19:49:54
我想明白了,幸运的是,解决方案很简单。我不知道为什么,但微软出于某种原因选择了错误的环境格式。要解决这个问题,只需使用=而不是没有空格的::
(...)
environment:
- DB_HOST=db
- VIRTUAL_HOST=my_domain.com
- LETSENCRYPT_HOST=my_domain.com
- LETSENCRYPT_EMAIL=my@email.com
(...)https://stackoverflow.com/questions/53432945
复制相似问题