构建 Dockerfile 使用非零代码 139 执行
Posted
技术标签:
【中文标题】构建 Dockerfile 使用非零代码 139 执行【英文标题】:Building the Dockerfile executes with non-zero code 139 【发布时间】:2020-06-19 02:27:27 【问题描述】:描述/复制步骤
我正在尝试在我的 Raspberry Pi 1 上的 docker 容器中运行 opc-ua 服务器示例“server_ctt”(使用来自 here 的 open62541 库),但是 我无法创建 docker 映像。
我首先按照here 上的说明进行了克隆。
之后,我尝试通过在 open62541 目录中执行以下命令来构建镜像:
docker build -f docker/Dockerfile .
这是我在终端中得到的输出:
pi@raspberrypi:~/ma/dockerVersion/open62541 $ docker build -f docker/Dockerfile .
Sending build context to Docker daemon 38.69MB
Step 1/18 : FROM alpine:3.10
3.10: Pulling from library/alpine
4e972d957a60: Pull complete
Digest: sha256:7c3773f7bcc969f03f8f653910001d99a9d324b4b9caa008846ad2c3089f5a5f
Status: Downloaded newer image for alpine:3.10
---> cf7ea1e5a972
Step 2/18 : RUN apk add --no-cache cmake gcc git g++ musl-dev mbedtls-dev python py-pip make && rm -rf /var/cache/apk/*
---> Running in 82c8b5868509
The command '/bin/sh -c apk add --no-cache cmake gcc git g++ musl-dev mbedtls-dev python py-pip make && rm -rf /var/cache/apk/*' returned a non-zero code: 139
在此之前,我已经使用便捷脚本here在我的树莓派上安装了docker
关于如何解决这个问题有什么建议吗?
背景资料
我通过 PuTTy 连接到我的树莓派。但我想这并没有什么不同。 此外,在 Windows 上构建映像并运行 server_ctt 示例完全可以正常工作。
编辑:
在我的 Windows 电脑上构建/运行 open62541 图像时,我尝试将其保存并复制到我的树莓派 1。我的树莓派上的 docker load 命令运行良好,运行图像输出后出现错误:
standard_init_linux.go:211: exec user process caused "exec format error"
这可能是由于架构不同(因为树莓派 1 使用 ARM 架构)。我该如何解决这个问题?
【问题讨论】:
错误代码 139 通常表示内存不足。鉴于您想在 Raspberry PI 上构建映像,这很有可能发生。您应该在更大的主机上构建映像,然后只在 Raspberry PI 上运行容器。 @Mihai 嘿!谢谢你的建议,看来是有道理的。我尝试了什么:我已经在我的 Windows 电脑上构建并保存了图像。然后我通过 WinSCP 将图像复制到我的树莓派 1,然后我加载了工作正常的图像。但是,如果我现在尝试在我的树莓派上运行该映像,我会收到以下错误:standard_init_linux.go:211: exec 用户进程导致“exec 格式错误”。原因可能是不同的架构(因为树莓派有 ARM 架构)。我该如何解决这个问题? 尝试在Linux环境下构建镜像。您可以在 windows 下启动一个 vagrant 机器并在您的图像中构建。 @Mihai 我尝试在 ubuntu 虚拟机中构建它,我也得到了相同的错误代码。有没有办法为树莓派(arm 架构)交叉编译镜像? 并非如此。您需要找到一个支持 arm 的基础镜像(例如:hub.docker.com/r/arm64v8/alpine)并基于它重建您的镜像。您使用的图像基于 alpine:3.10。很可能您还需要调整其他一些东西,但这是我要开始的地方。 【参考方案1】:要回答更新后的问题:您可以使用 experimental docker buildx
command 为您的 Raspberry Pi 构建。
这将创建一些虚拟化构建器,用于为所需架构构建容器。因此,构建过程可能需要更长的时间(我认为 10 倍对我的项目来说是现实的)。
对你的情况最重要的命令是这样的
docker buildx build --platform linux/arm/v7 .
【讨论】:
以上是关于构建 Dockerfile 使用非零代码 139 执行的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139
尝试使用 docker 构建 vue/quasar/node 应用程序时出错:“命令 '/bin/sh -c quasar build' 返回非零代码:1”
Flutter 运行 - 无法构建 iOS 应用程序 - 命令 PhaseScriptExecution 失败,退出代码为非零