docker-compose up 问题 使用 Docker Apple M1

cas*_*nav 8 docker

我真的不熟悉 docker,但我正在使用 docker 运行一个网络应用程序,该应用程序使用 prisma/nexus

当我尝试撰写时,出现以下错误:

 Error: Unknown binaryTarget linux-arm-openssl-undefined and no custom binaries were provided
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我这个错误是什么意思,我该如何解决它?我认为这与 docker 不支持我正在开发的操作系统有关,但我不完全确定。

Ale*_*tov 12

未定义意味着您没有在容器中安装 openssl。您可以通过安装 openssl 来获取正确的二进制目标名称。将其添加到 Dockerfile 中:

FROM node:16-slim
RUN apt-get update
RUN apt-get install -y openssl
Run Code Online (Sandbox Code Playgroud)

从这里回答https://github.com/prisma/prisma/issues/861#issuecomment-881992292


Fla*_*ken 10

官方文档来看,

\n
\n

Prisma 客户端由三个主要组件组成。

\n
    \n
  • JavaScript 客户端库
  • \n
  • TypeScript 类型定义
  • \n
  • 查询引擎(二进制文件形式)
  • \n
\n
\n

虽然生成的代码是跨平台的(这是 javascript),但事实query engine并非如此。

\n

当您运行该prisma generate命令时,prisma 似乎使用query engine,但它需要为当前平台找到正确的二进制文件,否则会抛出错误

\n

问题是由于某种原因我无法解释(因为我遇到了同样的问题)docker 中的平台不被识别为受支持的平台

\n

我的猜测是,要么 docker 提供了错误的平台,要么 prisma 在某个时候存在错误,其中的错误消息linux-arm-openssl-undefined 可能undefined是问题的线索。

\n

解决方案: 现在:我计划在 x86 计算机上运行我的图像,以便解决此问题。最新的 docker 3 RC2(5 天前发布)也没有帮助。

\n

请注意,您可以在文件中指定binaryTargets schema.prisma

\n
generator client {\n  provider = "prisma-client-js"\n  binaryTargets = ["debian-openssl-1.1.x"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但由于某种原因,即使我在 debian 上构建 docker 镜像,这也不起作用。Prisma 似乎认识到我正在运行linux-arm,但无法将 binaryTarget 关联到。另外\xe2\x80\xa6 这个平台真的准确吗?docker 是在后台运行 linux arm 还是在 Rosetta 下运行 x86 debian ?我不知道。

\n

[编辑]\n节点图像是多架构的,意味着

\n
FROM node:15.12.0-buster-slim AS builder\n
Run Code Online (Sandbox Code Playgroud)\n

将为我的主机平台选择 Linux 架构 (linux/arm64/v8)\n看起来我们实际上可以根据这篇文章使用 buildx 实验功能在 m1 上构建 x86

\n