0

我有一个连接到 Oracle 自治数据仓库的 dotnet 核心项目。通过 Visual Studio 运行项目可以完美运行。我想将项目容器化,但每当我运行容器时,它都无法连接到 ADW,失败并显示“TNS:无法解析连接标识符”

这是我的 Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY backend.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 1522
COPY --from=build /app .
ENTRYPOINT ["dotnet", "backend.dll"]

在我的项目中,我创建了一个名为“tns”的顶级文件夹。在那里,我拥有来自 ADW 的钱包文件中的所有内容。我已将 sqlnet.ora 文件修改为如下所示:

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="tns")))

这是我的撰写文件:

version: '3.4'

services: 

  frontend:
    image: pizzafrontend
    build:
      context: frontend
      dockerfile: Dockerfile
    environment: 
      - backendUrl=http://backend
    ports:
      - "5902:80"
    depends_on: 
      - backend
  
  backend:
    image: pizzabackend
    build: 
      context: backend
      dockerfile: Dockerfile
    ports: 
      - "5900:80"
      - "1522:1522"

我尝试添加环境变量 TNS_ADMIN="tns" 或 TNS_ADMIN="src/tns",但两者都没有任何区别。我对此束手无策,我觉得我非常接近答案,所以欢迎任何帮助。

4

1 回答 1

0

我认为你混淆了两件事:

  • 通过 TCP 或 UDP 协议的 2 个端口在 2 个容器之间进行简单通信。
  • 通过 HTTP 访问前端或后端(您需要什么)

在 docker-compose 中,“frontend”和“backend”值是容器的本地 IP,因此只能用于暴露端口之间的本地通信。

因此,您还需要一个变量:BACKEND_HOSTNAME。如果您在本地测试,它将值“localhost”,如果您部署,它将值服务器 IP 或域名。

因此 backendUrl 值 http://$BACKEND_HOSTNAME:5900 如果您的后端位于端口 5900 上。

于 2022-02-22T14:18:18.890 回答