- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个非常简单的 docker 镜像,它必须预先安装了 lua、luarocks 和其他一些可执行文件,dockerfile 如下:
FROM busybox AS builder
WORKDIR /usr/local/bin
# installs curl (reliable alternative to wget)
RUN wget -O curl https://github.com/moparisthebest/static-curl/releases/download/v7.79.1/curl-amd64 && \
chmod +x curl
# installs luaformatter
RUN wget -O lua-format https://github.com/Koihik/vscode-lua-format/raw/master/bin/linux/lua-format && \
chmod +x lua-format
# installs stylua
RUN wget -O stylua-0.11.0-linux.zip https://github.com/JohnnyMorganz/StyLua/releases/download/v0.11.0/stylua-0.11.0-linux.zip && \
unzip stylua-0.11.0-linux.zip && \
rm stylua-0.11.0-linux.zip && \
chmod +x stylua
# installs selene
RUN wget -O selene-light-0.14.0-linux.zip https://github.com/Kampfkarren/selene/releases/download/0.14.0/selene-light-0.14.0-linux.zip && \
unzip selene-light-0.14.0-linux.zip && \
rm selene-light-0.14.0-linux.zip && \
chmod +x selene
# installs lua (standalone binary)
RUN curl -k -o lua-5.4.2_Linux54_64_bin.tar.gz -L https://sourceforge.net/projects/luabinaries/files/5.4.2/Tools%20Executables/lua-5.4.2_Linux54_64_bin.tar.gz && \
tar xvf lua-5.4.2_Linux54_64_bin.tar.gz && \
mv lua54 lua && \
rm -rf lua-5.4.2_Linux54_64_bin.tar.gz luac54
# installs luarocks (standalone binary)
RUN wget -O luarocks-3.7.0-linux-x86_64.zip https://luarocks.github.io/luarocks/releases/luarocks-3.7.0-linux-x86_64.zip && \
unzip luarocks-3.7.0-linux-x86_64.zip && \
mv luarocks-3.7.0-linux-x86_64/luarocks . && \
rm -rf luarocks-3.7.0-linux-x86_64*
FROM busybox
COPY --from=builder /usr/local/bin /usr/local/bin
WORKDIR /ataraxis
RUN luarocks install luacheck
CMD stylua lua/ataraxis && \
lua-format -i lua/ataraxis/*.lua && \
luacheck --config .luacheckrc lua/ataraxis/*.lua && \
selene lua/ataraxis
我尝试同时使用 Alpine 和 Busybox 作为我的 Dockerfile 的基础镜像,但没有成功运行这些可执行文件,即使它们位于 $PATH
默认包含的目录中( /usr/local/bin
),每当我尝试运行它们中的任何一个时,都会显示以下错误:
$ lua
/bin/sh: lua: not found
我已经搜索并尝试了我能想到的每一个可能的解决方案,但仍然没有成功
最佳答案
长话短说:
错误 lua: not found
是动态链接失败的症状,在基于 musl-libc 的 Linux(例如 Alpine Linux 和基于 busybox)上尝试运行大陆 Linux 二进制文件时很常见图片。
要解决此问题,请切换到基于轻量级 glibc 的镜像(例如 Debian Slim)或在 Alpine 容器上安装 glibc。让 BusyBox 工作是不切实际的。
完整解释:
一些背景知识。 libc ,标准 C 库,为 Linux 程序提供 C 和 POSIX API,是 Linux 系统的固有部分。大多数 Linux 发行版都基于 glibc , GNU C 库。然而,Alpine Linux 和 BusyBox 镜像都是基于 musl 的。标准 C 库,通常与 glibc 不兼容。因此,构建在基于 glibc 的发行版(如 Ubuntu、Debian 或 Arch Linux)上的可执行文件无法在 Alpine Linux 或 BusyBox 上开箱即用。
尝试运行 glibc 可执行文件时出现链接错误。您可以通过将图像切换到 alpine
并运行 ldd
来验证这一点:
/ataraxis # ldd /usr/local/bin/luarocks
/lib64/ld-linux-x86-64.so.2 (0x7fbd14310000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7fbd14310000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fbd14310000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fbd14310000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fbd14310000)
Error relocating /usr/local/bin/luarocks: __fprintf_chk: symbol not found
Error relocating /usr/local/bin/luarocks: makecontext: symbol not found
Error relocating /usr/local/bin/luarocks: setcontext: symbol not found
Error relocating /usr/local/bin/luarocks: __register_atfork: symbol not found
Error relocating /usr/local/bin/luarocks: __strdup: symbol not found
Error relocating /usr/local/bin/luarocks: __libc_alloca_cutoff: symbol not found
Error relocating /usr/local/bin/luarocks: __stpncpy: symbol not found
Error relocating /usr/local/bin/luarocks: __syslog_chk: symbol not found
Error relocating /usr/local/bin/luarocks: getcontext: symbol not found
Error relocating /usr/local/bin/luarocks: __open_2: symbol not found
Error relocating /usr/local/bin/luarocks: errno: symbol not found
使用 Alpine Linux 的简单而安全的解决方案是使用 Alpine 包管理器安装兼容软件,apk .但是,Alpine 可能不存在所需的包,因为特定的包版本可能不可用。在这种情况下,您有两个选择:
debian:buster-slim
- 27MB 压缩),而不是 Alpine/BusyBox为什么不用 BusyBox:
BusyBox 不适合这种定制。由于它甚至没有包管理器,因此必须手动完成所有更改和添加。这无疑是一个极其繁琐和冗长的过程。 Alpine 仍然是一个非常轻量级的镜像,您可以在其中相当简单地安装 glibc。
使用 glibc 将图像更新为 Alpine:
首先,将 busybox
替换为 Alpine,最好是 alpine:3.14
,这是最新的 Alpine 版本(在第 1 行和第 37 行)。
其次,在COPY
命令后添加以下行:
ENV GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc
ENV GLIBC_VERSION=2.30-r0
RUN set -ex && \
apk --update add libstdc++ curl ca-certificates && \
for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION}; \
do curl -sSL ${GLIBC_REPO}/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \
apk add --allow-untrusted /tmp/*.apk && \
rm -v /tmp/*.apk && \
/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib
这将在 Alpine 容器上安装 glibc。最后,运行 luarocks
。
作为引用,我已经在 pastebin 上发布了 docker 构建输出。 .
关于linux - 无法使用 Alpine 和 Busybox docker 图像运行可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69607005/
我正在尝试将“join”命令安装到我的 yocto 镜像中。我已经安装了 busybox,它没有 join 功能,但有 coreutils 的子集。 Coreutils 确实具有 join 功能,因此
我已经为我的嵌入式 Linux 剥离了 busy box。目前 busy box 仅支持 ps -w 选项。 我需要对应用程序的 CPU 和内存使用情况进行采样,并且采样应该至少每秒 5 个。 Top
我想在 BusyBox 服务器上启用 SSH 服务(目前我只能通过 Telnet 连接),所以我想,我需要编译 SSH 服务器,并将它发送到 BusyBox 路由器。所以我的问题是 - 如何创建 SS
buildroot 支持从 git repo 下载包。但是我的 git repo 包含子模块。 如何命令 buildroot 下载带有子模块的包? 最佳答案 自~ July 2016您可以为包启用子模
我正在使用 MobaXterm 便携版。 我发现了一个奇怪的设置,总结在这里。 /bin 中的外部命令工作正常。例如,使用 /bin/ssh.exe我可以 ssh好的。 内部命令是 “重定向”到bus
我是Docker的新手 我已经运行了 sudo docker run --interactive --tty --link web:web --name web_test busybox:lates
我在Kubernetes中创建了一个命名空间,并尝试使用以下命令创建一个容器: kubectl run busybox -it ----image=busybox -- sh 但是现在,每次我使用ku
我尝试在带有 PowerPc 的嵌入式系统上安装 BusyBox 1.20.2。起初我想尝试使用默认配置。所以这是命令 make defconfig make 这是结果: ma-bash-3.2# m
busybox 是否以共享库形式提供?我想以编程方式使用单个应用程序,而不是使用 system()。我听说过 libbusybox 和 libbb,但找不到任何文档。 最佳答案 存在名为 libbus
最近,我尝试按照“Pro Linux Embedded Systems”一书中提供的步骤为 MIPS 架构构建 busybox。事先,我已经成功安装和配置了 crosstool-ng 以使用 MIPS
我在/etc/inittab 中运行 BusyBox ::sysinit:/etc/init.d/rcS rcS 脚本在启动时调用/etc/rc.d/中的所有启动脚本。 如何可能通过在调用 BusyB
我想知道如何知道Busybox的版本。搜索互联网我发现这段代码: public void busybox()throws IOException { /* *
我正在开发一些在 Linux/BSD/Mac/Windows 上运行的 bash 脚本。我想将它们移植到 busybox 环境,让它们在 android 终端模拟器(如 termux)中运行。 获得
在构建 busybox 时,我发现一些源文件包含 linux 内核头文件。我添加了#define __KERNEL__ 来选择头文件行的某些部分。我还在内核头文件中添加了 #define _BUSYB
Busybox 不包含传统的 Linux"file"命令。有没有其他方法可以检测文件是二进制还是ascii?谢谢 最佳答案 你可以尝试使用grep。该线程包含使用 grep 命令的一些变体:https
我遇到了看起来有点奇怪的情况。 基础机器是 Ubuntu 18.04。我正在尝试创建一个自定义 initramfs + init 脚本,以与与 qemu 实例一起使用的自定义编译内核一起使用。 从我用
嵌入式 Linux 上的 Busybox,SSH 命令。 rm 命令只删除当前目录中的文件,还是也删除子目录中的文件?这是目录结构: ls -la total 5 drwxr-xr-x 3 r
我需要我的 docker 容器中的用户。我的构建来自缺少 groupadd 的 busybox 图像,我尝试使用 apt-get 添加它,但它也丢失了。我需要将什么添加到我的 Dockerfile 才
我在我的嵌入式 linux 板上安装了 busybox 作为“入门”包,我还需要使用 iptables 来配置一些防火墙规则。 有没有办法从 busybox shell 访问 iptables? 否则
我正在使用 Busybox 测试和嵌入 linux CPE; BusyBox v1.00 (2012.07.10-03:48+0000) multi-call binary 我想尝试使用盒子上所有可用
我是一名优秀的程序员,十分优秀!