我有一個 asp.net webApi 應用程式并使用 redis 堆疊作為主資料庫。我能夠連接到資料庫并正常執行操作,直到我從我的應用程式制作了一個 docker 映像并嘗試在 docker 上運行它。即使我已將“localhost”更改為“容器名稱”并將其設定為我的 docker-compose 檔案中的環境變數,應用程式也無法連接到 redis 堆疊。這是我的連接代碼和我的 docker-compose 檔案以供參考。
連接 Redis 堆疊代碼(使用Redis OM包):
builder.Services.AddSingleton(new RedisConnectionProvider(builder.Configuration[Environment.GetEnvironmentVariable("REDIS_CONNECTION_STRING", EnvironmentVariableTarget.Process)]));
builder.Services.AddHostedService<IndexCreationService>();
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["API/API.csproj", "API/"]
COPY ["Core/Core.csproj", "Core/"]
COPY ["Persistence/Persistence.csproj", "Persistence/"]
COPY ["Service/Service.csproj", "Service/"]
RUN dotnet restore "API/API.csproj"
COPY . .
WORKDIR "/src/API"
RUN dotnet build "API.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "API.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API.dll"]
Docker-compose.yaml
version: '3.7'
services:
redis:
image: redis/redis-stack
container_name: redis
volumes:
- db-data:/data/redis
ports:
- "6379:6379"
- "8001:8001"
restart: unless-stopped
networks:
- course-network
CourseService:
image: dexam/course-service
container_name: course-service
volumes:
- course-service-data:/data/course_service
ports:
- "443:443"
environment:
- REDIS_CONNECTION_STRING=redis://redis:6379
restart: unless-stopped
depends_on:
- "redis"
links:
- "redis"
networks:
- course-network
volumes:
db-data:
course-service-data:
networks:
course-network:
driver: bridge
我得到的錯誤資訊:
未處理的例外。StackExchange.Redis.RedisConnectionException:無法連接到 redis 服務器。立即連接錯誤。要允許此多路復用器繼續重試直到能夠連接,請在連接字串中使用 abortConnect=false 或 AbortOnConnectFail=false; 在你的代碼中。在 StackExchange.Redis.ConnectionMultiplexer.ConnectImpl(ConfigurationOptions configuration, TextWriter log) in / /src/StackExchange.Redis/ConnectionMultiplexer.cs:line 1162 at StackExchange.Redis.ConnectionMultiplexer.Connect(ConfigurationOptions configuration, TextWriter log) in / /src/ StackExchange.Redis/ConnectionMultiplexer.cs:Redis.OM.RedisConnectionProvider..ctor(String connectionString) 處的第 1028 行 Program.$(String[] args) 在 /src/API/Program.cs:line 17
誰能發現問題?
uj5u.com熱心網友回復:
看起來您是否將連接字串從環境或配置中拉出有點混亂:
builder.Services.AddSingleton(new RedisConnectionProvider(builder.Configuration[Environment.GetEnvironmentVariable("REDIS_CONNECTION_STRING", EnvironmentVariableTarget.Process)]));
這一行沒有真正意義,您正試圖從您的 appsettings 檔案中提取一個配置變數,其名稱是您的環境變數的VALUE (您在 docker-compose 中設定為) - 這很可能會出現作為空字串,因此無法正確決議和連接 - Redis OM 在配置中遇到空字串時的默認行為是連接到 redis://localhost:6379,因為那里沒有 redis 實體,它會像這樣失敗你展示的方式。REDIS_CONNECTION_STRINGredis://redis:6379
您正在尋找兩件事中的一件
- 您想從環境變數中提取連接字串,如果您將該行更改為以下內容,給定您的 docker-compose 檔案,這應該可以正常作業
builder.Services.AddSingleton(new RedisConnectionProvider(Environment.GetEnvironmentVariable("REDIS_CONNECTION_STRING", EnvironmentVariableTarget.Process)));
- 您確實想從配置中提取連接字串,這是有效的,但您需要確保在構建映像之前在配置中設定連接字串:
builder.Services.AddSingleton(new RedisConnectionProvider(builder.Configuration["REDIS_CONNECTION_STRING"]));
這兩種方法都是有效的,但它們不能很好地結合在一起,這就是為什么你在這里會有點胃灼熱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/476090.html
標籤:C# 网 码头工人 asp.net-web-api 雷迪斯
