docker沿着postgresql容器的一侧组成C#ASP.NET MVC应用程序容器未能连接到[::1]:5432



我正试图在同一docker网络上运行的两个相应docker容器中的postgres服务器旁边启动我的C#ASP.NET MVC应用程序。这行不通。以下是相关代码。

appsettings.Development.json:

{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"db": "Host=localhost;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432"
}
}

appsettings.json:

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"db": ""
},
"ApiEndpoints": {
"TestNet": [
"https://api.bitcore.io/api/BTC/testnet/",
"https://api.blockcypher.com/v1/btc",
"<API KEY HERE>"
],
"MainNet": [
"https://api.bitcore.io/api/BTC/mainnet/",
"https://api.blockcypher.com/v1/btc",
"<API KEY HERE>"
],
"db": "Host=localhost;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432",
}
}

docker-compose.yml:

version: '3.8'
volumes:
data:
networks:
api-dev:
driver: bridge
services:
postgresql:
image: postgres
# explicit container name
container_name: postgresql
environment:
- POSTGRES_USER=amaranth_test_user
- POSTGRES_PASSWORD=postgrespw123
- POSTGRES_DB=amaranth_tests
ports:
- 5432:5432
volumes:
- data:/var/lib/postgresql
networks:
- api-dev
amaranth_main:
container_name: amaranth_main
links:
- postgresql
depends_on:
- postgresql
build:
context: .
dockerfile: Dockerfile
networks:
- api-dev
ports:
- "8000:80"
command: ["./wait-for-postgres.sh", "postgresql", "dotnet", "amaranth.dll"]

Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
# Copy everything
COPY . ./
# Restore as distinct layers
ENV PATH $PATH:/root/.dotnet/tools
RUN dotnet tool install -g dotnet-ef --version 6.0.8
RUN dotnet restore
RUN dotnet ef database update
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "amaranth.dll"]
#!/bin/sh
# wait-for-postgres.sh
set -e

host="$1"
shift

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c 'q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done

>&2 echo "Postgres is up - executing command"
exec "$@"

包括实际应用程序在内的所有上述文件都在应用程序amaranth的根目录中。

问题是,当我运行docker-compose up时,我的终端中出现了这个错误。

#10 6.663 Failed to connect to [::1]:5432

在DockerfileRUN dotnet ef database update中,此步骤失败。从终端来看,在ASP.NET应用程序开始运行之前,它似乎没有等待postgresql容器完成启动,尽管我在docker compose文件中向amaranth_main(ASP.NET容器(添加了depends_on:参数和"./wait-for-postgres.sh"命令。那么,为什么这不起作用呢?

此外

我试着用Host=postgresql代替Host=localhost,得到了#13 6.506 Name or service not known

问题是连接字符串,在容器网络中,它无法连接localhost,因为它会试图在容器中找到localhost,在docker compose的情况下,您需要使用servicename来访问postgres容器,在您的情况下它是"postgresql";。

所以你在appsettings.json中的连接字符串应该是

db="Host=postgresql;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432",

或者,您可以将amaranth_main的docker compose文件中的连接字符串作为传递

environment:
- ConnectionStrings__db=Host=postgresql;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432

希望能有所帮助。

根据进一步讨论更新ans:

RUN dotnet ef database update这需要让数据库运行,但在图像生成过程中,它在您的情况下没有运行。因此最好在代码内部进行迁移。您可以从dockerfile中删除数据库更新,并在启动期间在代码中执行。这是通常遵循的最佳做法。还有

你可以查看这个链接。它有一篇关于如何在strartup上进行迁移的详细文章。

相关内容

最新更新