繁体   English   中英

Docker,启动服务失败:无法为运行时启动新的语言工作者:节点。 Apple M1 有问题吗?

[英]Docker, failed to start service: Failed to start a new language worker for runtime: node. Problem with Apple M1?

Part of my dockerfile:

FROM node:18-alpine as installer
WORKDIR /app
ENV NODE_ENV=development
COPY package*.json .
COPY tsconfig.json .
RUN npm ci

FROM node:18-alpine as builder
WORKDIR /app
ENV NODE_ENV=development
COPY --from=installer /app/ .
COPY src/ ./src/
RUN npm run build

我的 docker-compose.yml 的一部分

version: '3.8'

services:
  function-app:
    container_name: function-app
    restart: always
    depends_on:
      - mongo
    build: .
    environment:
      - DB_HOST=mongo:27017
      - DB_USERNAME=qq
      - DB_PASSWORD=qq
    ports:
      - 1337:80
    volumes:
      - ./dist/:/home/site/wwwroot/

这适用于我所有的同事。

我明白了:

在此处输入图像描述

我尝试更改为FROM --platform=linux/amd64 node:18-alpine as installer

没有效果。

我是团队中唯一使用 Apple M1 计算机的人。 也许这就是问题所在?

任何建议可能是什么问题以及如何解决?

更新

我重新安装了 docker。出现了一个新错误:“功能未实现”,它指出我在这里:https://github.com/Azure/azure-functions-core-tools/issues/2901

该线程的摘要:目前没有针对 M1 的解决方案。

所以我们在项目上离开了 docker(目前不是最受欢迎的团队成员)。

感谢您的所有回答!

在下面发布的我的原始回答中,我试图帮助您创建一个能够在 Apple M1 arm64 架构上运行的节点图像,但问题的原因可能是另一个。

您在 Docker 文件中包含了您正在使用的installerbuilder映像,但是根据您提供的错误,您似乎正在使用Azure Functions for node docker 映像

如果是这样的话,目前看来,正如您在这个其他Github 问题中看到的那样,这个图像还不支持 arm64 架构。 您也可以在Docker Hub中查看不同标签的列表来验证它。

您可以按照这篇文章中的建议尝试构建您自己的图像,但我不知道这是否是一个可能的解决方案。

我认为使用 Apple M1 和我之前在下面的回答或类似回答中建议的方法为 amd64 构建图像应该没有任何问题; 结果图像应该能够在 linux amd64 中运行而不会出现进一步的问题。 唯一的问题是尝试在 arm64 中运行它。

为了提供上下文,我的原始答案如下。

我的第一句话应该是我没有机会使用 Apple M1 电脑,所以以下答案仅基于假设而不是我希望的事实:请将其仅作为一般指导、背景信息,而不是真正的答案,因为我不确定它是否有效。

该错误表明您的 Functions 运行时可以正确启动。

它可能是由不同的原因引起的,并且由于使用 Apple Silicon M1 的不同芯片组架构而使用不受支持的node版本可能是其中之一。

它可能没有效果,但您可以尝试为不同的架构明确构建您的图像。

构建多平台镜像的过程在Docker 文档中有很好的描述。

该文档提供了一个入门部分,指示了为设置构建系统需要执行的不同步骤。

基本上,作为第一步,您可能需要基于docker 容器驱动程序创建一个新的构建器:

docker buildx create --name my-builder --driver docker-container --use

如文档中所述:

与基本的 docker 驱动程序相比,使用 docker-container 驱动程序有几个优点。 首先,我们可以手动覆盖 buildkit 的版本来使用,这意味着我们可以在它们发布后立即访问最新和最强大的功能,而不是等待升级到 Docker 的更新版本。此外,我们可以访问更复杂的多架构构建和更高级的缓存导出器等功能,默认 docker 驱动程序目前不支持这些功能。

创建的构建器应该出现在可用列表中。 您可以通过发出以下命令来验证它:

docker buildx ls

如上述 Docker 文档中所述,根据您的设置,可能需要安装以下内容以提供对其他平台的支持:

docker run --privileged --rm tonistiigi/binfmt --install all

请考虑阅读这个相关的 SO 问题

如果一切正常,您应该能够使用目录中的以下内容构建您的图像:

docker buildx build --platform linux/arm64 -t your_image --load .

上面的命令假定您没有使用注册表并且图像将存储在本地:只有当您提供单一平台目标时它才会起作用。

请注意,我使用的是linux/arm64而不是linux/amd64 :老实说我对此有点困惑,但我认为您应该使用您的应用程序应该运行的平台。 这篇来自 docker 博客的精彩文章,总的来说,提供了我读过的关于 docker 多平台构建如何工作的更好的解释之一; 特别是,它提供了有关可用于使Dockerfile跨不同平台移植的不同变量的重要指导。

生成的图像可以稍后在 docker-compose 中使用:

version: '3.8'

services:
  function-app:
    container_name: function-app
    restart: always
    depends_on:
      - mongo
    image: your_image
    environment:
      - DB_HOST=mongo:27017
      - DB_USERNAME=qq
      - DB_PASSWORD=qq
    ports:
      - 1337:80
    volumes:
      - ./dist/:/home/site/wwwroot/

当我看到你的问题时,我正在深入研究这个问题,它“似乎”docker-compose 无法按照描述构建图像:这就是我直接使用docker buildx命令的原因。 请考虑查看此 SO 问题和以下有关此问题的Docker 桌面文档

什么 output 有docker info命令? 也许你应该通过 brew 安装 docker: brew install --cask docker

要解决此问题,您可以尝试将 Dockerfile 更改为:

FROM --platform=linux/amd64 node:18-alpine as installer
WORKDIR /app
ENV NODE_ENV=development
COPY package*.json .
COPY tsconfig.json .
RUN npm ci

FROM --platform=linux/amd64 node:18-alpine as builder
WORKDIR /app
ENV NODE_ENV=development
COPY --from=installer /app/ .
COPY src/ ./src/
RUN npm run build

FROM --platform=linux/amd64 node:18-alpine as runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/ .
COPY --from=builder /app/node_modules/ ./node_modules/
EXPOSE 80
CMD ["npm", "start"]

解释:问题是 node:18-alpine 图像不适用于 Apple M1 架构。 解决方案是使用 --platform=linux/amd64 标志强制为 x86 架构构建映像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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