![](/img/trans.png)
[英]Docker-Compose cannot run in Docker Apple Silicon Tech Preview? (apple silicon m1)
[英]docker-compose up issue Using Docker Apple M1
我真的不熟悉 docker,但我正在使用 docker 运行一个 web 应用程序,它使用 prisma/nexus
当我尝试撰写时,出现此错误:
Error: Unknown binaryTarget linux-arm-openssl-undefined and no custom binaries were provided
谁能告诉我这个错误是什么意思,我该如何解决? 我认为这与 docker 不支持我正在使用的操作系统这一事实有关,但我不完全确定。
从官方文档,
Prisma Client 由三个主要组件组成。
- JavaScript 客户端库
- TypeScript 类型定义
- 查询引擎(二进制文件形式)
虽然生成的代码是跨平台的(这是 javascript),但query engine
不是。
当您运行prisma generate
命令时,prisma 似乎使用了query engine
,但它需要为当前平台找到合适的二进制文件, 否则会引发错误。
问题是由于某种原因我无法解释(因为我有同样的问题)docker 中的平台未被识别为受支持的平台之一。
我的猜测是 docker 提供了错误的平台,或者在某些时候 prisma 中存在错误,错误消息linux-arm-openssl-undefined
with undefined
可能是问题的线索。
解决方案:现在:我计划在 x86 计算机上运行我的图像,以便修复此问题。 最新的 docker 3 RC2(5 天前发布)也没有帮助。
请注意,您可以在schema.prisma
文件中指定 binaryTargets。
generator client {
provider = "prisma-client-js"
binaryTargets = ["debian-openssl-1.1.x"]
}
但是由于某种原因,即使我在 debian 之上构建我的 docker 映像,这也不起作用。 Prisma 似乎认识到我在linux-arm
上,但无法将 binaryTarget 关联到。 还有……这个平台真的准确吗? Is docker running an linux arm under the hood or an x86 debian under rosetta? 我不知道。
[编辑] 节点图像是多拱的,意思是
FROM node:15.12.0-buster-slim AS builder
将为我的主机平台(linux/arm64/v8)选择 linux 架构 看来我们实际上可以根据这篇文章使用 buildx 实验功能在 m1 上为 x86 构建
未定义意味着您没有在容器中安装 openssl。 您可以通过安装 openssl 获得正确的二进制目标名称。 将此添加到 Dockerfile:
FROM node:16-slim
RUN apt-get update
RUN apt-get install -y openssl
从这里回答https://github.com/prisma/prisma/issues/861#issuecomment-881992292
使用node:alpine
时我遇到了同样的问题。 首先,我尝试使用apk add openssl
手动安装 openssl 但仍然存在一些其他问题。
我设法通过切换到node:lts
lts 并添加到我的 Dockerfile RUN apt-get -qy update && apt-get -qy install openssl
来解决它
将您的基本图像从高山更改为节点,这应该可以解决您在 M1 上面临的问题。 有关此线程线程的更多信息
这也可能意味着您在Dockerfile中使用的图像(例如 FROM node:16-alpine )不适用于ARM 。
大多数(如果不是全部)图像可用于x86 [x86_64|amd64] 架构,但并非所有图像都可用于ARM 。 您可以在图像存储库中查看它(例如: https://hub.docker.com )
当您在 M1 Mac(带有ARM CPU)上构建图像时,Docker 猜测您想要为ARM构建图像。 那可能是你的情况。
但对于 OP,我认为情况可能并非如此,他/她的目标是在云 Linux 服务器中远程运行构建的映像,截至目前,这些服务器主要是x86 [x86_64|amd64] 机器。
如果这是您的场景,并且您希望为x86 [x86_64|amd64] 构建图像,您可以在Dockerfile FROM条目(或多阶段条目)中指定架构,并向它们添加一个指定架构的参数。
所以,而不是
FROM node:16-alpine
做这个
FROM --platform=linux/amd64 node:16-alpine
注意:如果您的Dockerfile是多阶段的(即:有很多FROM条目),请确保替换所有条目
这将使图像构建并以x86而不是 ARM 为目标,尽管你的 M1 Mac 有什么 CPU,我认为这是 OP 的目标。
对我来说,什么有效与下面的一些答案混合在一起。
对于正在安装和生成 Prisma 的容器,我做了以下更改:
# FROM node:fermium-alpine3.16 AS deps
FROM node:16-slim AS deps
RUN apt-get update
RUN apt-get install -y openssl libssl-dev
对于运行的容器,我做到了:
# FROM node:fermium-alpine3.16 AS runner
FROM --platform=linux/amd64 node:fermium-alpine3.16 AS runner
谢谢大家的解答。 我希望它能帮助别人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.