![](/img/trans.png)
[英]Azure Function Node.js Failed to start a new language worker for runtime: node
[英]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 文件中包含了您正在使用的installer
和builder
映像,但是根据您提供的错误,您似乎正在使用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.