繁体   English   中英

docker-compose up issue 使用Docker Apple 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 的目标。

  • 构建的镜像将兼容并在目标 x86 服务器上以本机速度运行
  • 您仍然可以在 M1 Mac 上通过 Rosetta2 x86 仿真(虽然速度稍慢)通过 Docker for Mac 在本地运行这些图像以用于开发或调试/诊断目的。

对我来说,什么有效与下面的一些答案混合在一起。

对于正在安装和生成 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM