有一个 .NETCore 应用程序,它通过 Google Cloud Translation SDK 使用 Google 服务
应用内部没有授权,只是翻译的代码
TranslationClient client = TranslationClient.Create();
var response = client.TranslateText(
text: phrase,
targetLanguage: endLanguage,
sourceLanguage: startLanguage);
要使用它们,您需要从 Google 控制台下载 .json 格式的密钥,然后在系统环境变量中指定它的路径
GOOGLE_APPLICATION_CREDENTIALS = C:/Key.json
它适用于 Visual Studio 的 Windows 10,但我在 prod 上有 Ubuntu,在它上面有 docker,在 docker 中它是一个 .NETCore 应用程序。
如何从 docker 指定它的路径?我可以把这个文件放在项目的根目录下,然后它会在docker里面,但是通过环境变量访问不会这样做。也许有一种方法可以告诉 Google 从项目中直接访问文件,而不是通过环境变量?
Dockerfile
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MyApp.App.csproj", ""]
RUN dotnet restore "./MyApp.App.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyApp.App.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyApp.App.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.App.dll"]
有多种方法可以将密钥传递给容器。
Dockerfile
可以在启动/创建容器时传递环境变量和文件而不更改它。例如:这将导致
-v $(pwd)/key.json:/key.json
文件与密钥沿路径/key.json
。并相应地添加了环境变量-e GOOGLE_APPLICATION_CREDENTIALS=/key.json
。您可以
Dockerfile
立即添加环境变量(以免每次启动时都添加),但仍然挂载文件。例如:现在它可以像这样运行:
但是你也可以在最终的镜像中添加一个密钥文件(Dockerfile),这种方式适合开发或者测试,但是最好不要在真实的应用上使用(最好不要在镜像中添加秘密信息,很容易从那里得到它)。
然后您可以使用之前使用的命令启动容器,无需额外操作。不需要参数。