gpt4 book ai didi

linux - 即使在 PATH 中也找不到 Docker Alpine 可执行二进制文件

转载 作者:行者123 更新时间:2023-12-03 23:33:15 33 4
gpt4 key购买 nike

我有一个 alpine 运行容器,其中包含 usr/local/bin 中的一些二进制文件
当我ls usr/local/bin的内容我得到了这个输出:

/usr/local/bin # ls
dwg2SVG dwg2dxf dwgadd dwgbmp dwgfilter dwggrep dwglayers dwgread dwgrewrite dwgwrite dxf2dwg dxfwrite
这是我所期望的。
但是,如果我通过调用它来执行其中一个二进制文件,我会得到一个 not found来自 shell 的错误:
/usr/local/bin # dwg2dxf
sh: dwgread: not found
/usr/local/bin # ./dwg2dxf
sh: ./dwgread: not found
我测试了我的 $PATH这似乎是正确的:
/usr/local/bin # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
如何使这些二进制文件可调用或“可创建”?我是否错过了 Dockerfile 构建中的某些内容?
我想 ldconfig 有问题alpine 中的命令出错了,但我不确定。
编辑
正如这里的一个答案所建议的,我执行了 file命令,这是输出:
/usr/local/bin # file dwg2dxf
dwgread: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=7835d4a42651a5fb7bdfa2bd8a76e40096bacb07, with debug_info, not stripped
这些二进制文件来自 LibreDWG Official repository以及我的 Dockerfile 的第一部分。这是完整的 Dockerfile :
# podman/docker build -t libredwg .
############################
# STEP 1 build package from latest tar.xz
############################

FROM python:3.7.7-buster AS extracting
# libxml2-dev is broken so we need to compile it by our own
ARG LIBXML2VER=2.9.9
RUN apt-get update && \
apt-get install -y --no-install-recommends autoconf libtool swig texinfo \
build-essential gcc libxml2 python3-libxml2 libpcre2-dev libpcre2-32-0 curl \
libperl-dev libxml2-dev && \
mkdir libxmlInstall && cd libxmlInstall && \
wget ftp://xmlsoft.org/libxml2/libxml2-$LIBXML2VER.tar.gz && \
tar xf libxml2-$LIBXML2VER.tar.gz && \
cd libxml2-$LIBXML2VER/ && \
./configure && \
make && \
make install && \
cd /libxmlInstall && \
rm -rf gg libxml2-$LIBXML2VER.tar.gz libxml2-$LIBXML2VER
WORKDIR /app
RUN tarxz=`curl --silent 'https://ftp.gnu.org/gnu/libredwg/?C=M;O=D' | grep '.tar.xz<' | \
head -n1|sed -E 's/.*href="([^"]+)".*/\1/'`; \
echo "latest release $tarxz"; \
curl --silent --output "$tarxz" https://ftp.gnu.org/gnu/libredwg/$tarxz && \
mkdir libredwg && \
tar -C libredwg --xz --strip-components 1 -xf "$tarxz" && \
rm "$tarxz" && \
cd libredwg && \
./configure --disable-bindings --enable-release && \
make -j `nproc` && \
mkdir install && \
make install DESTDIR="$PWD/install" && \
make check DOCKER=1 DESTDIR="$PWD/install"

############################
# STEP 2 install into stable-slim
############################

# pull official base image
FROM osgeo/gdal:alpine-normal-latest

# set work directory
WORKDIR /usr/src/app



# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# copy requirements file
COPY ./requirements.txt /usr/src/app/requirements.txt

# install dependencies
RUN set -eux \
&& apk add --no-cache --virtual .build-deps build-base \
py3-pip libressl-dev libffi-dev gcc musl-dev python3-dev postgresql-dev\
&& pip3 install --upgrade pip setuptools wheel \
&& pip3 install -r /usr/src/app/requirements.txt \
&& rm -rf /root/.cache/pip

# Install libredwg binaries
COPY --from=extracting /app/libredwg/install/usr/local/bin/* /usr/local/bin/
COPY --from=extracting /app/libredwg/install/usr/local/include/* /usr/local/include/
COPY --from=extracting /app/libredwg/install/usr/local/lib/* /usr/local/lib/
COPY --from=extracting /app/libredwg/install/usr/local/share/* /usr/local/share/
RUN ldconfig /usr/local/bin/
RUN ldconfig /usr/local/include/
RUN ldconfig /usr/local/lib/
RUN ldconfig /usr/local/share/

# copy project
COPY . /usr/src/app/

最佳答案

在 Alpine Linux 上,not found 错误是动态链接故障的典型症状。 musl 的 ldd 链接器确实是一个相当困惑的错误。
世界上大多数 Linux 软件都链接到 glibc ,即 GNU libc 库(libc 提供标准 C 库和 POSIX API)。大多数 Linux 发行版都基于 glibc。 OTOH,Alpine Linux 基于 musl libc 库,这是一个最小实现并且严格符合 POSIX。例如,基于 glibc 发行版构建的可执行文件依赖于 /lib/x86_64-linux-gnu/libc.so.6 ,这在 Alpine 上不可用(除非它们是静态链接的)。
除了这种依赖关系之外,重要的是要注意,虽然 musl 试图在一定程度上保持 glibc 兼容性,但它远未完全兼容,并且针对 glibc 构建的复杂软件无法与 musl-libc 一起使用,因此只需将 /lib/ld-musl-x86_64.so.1 符号链接(symbolic link)到glibc 路径不太可能起作用。
通常,有几种方法可以在 Alpine 上运行 glibc 二进制文件:

  • 安装一个 glibc 兼容包,libc6-compatgcompat:
  • # apk add gcompat
    apk add libc6-compat
    这两个包都提供了一个轻量级的 glibc 兼容层,它可能适合运行简单的 glibc 应用程序。 libc6-compat 实现 glibc 兼容性 API,并提供到 glibc 共享库的符号链接(symbolic link),例如 libm.solibpthread.solibcrypt.sogcompat 包基于 Adelie Linux gcompat project 并执行相同的操作,但提供了单个库 libgcompat.so 。这两个库都安装了加载程序 stub 。取决于应用程序,其中一个可能有效,而另一个无效,因此最好同时尝试两者。
  • 在 Alpine 上安装正确的 glibc,以提供所有 glibc 方法和功能。有可用于 Alpine 的 glibc 构建,应按以下过程安装(示例):
  • # Source: https://github.com/anapsix/docker-alpine-java

    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
  • 使用静态链接的可执行文件。静态可执行文件不携带动态依赖项,可以在任何 Linux 上运行。
  • 或者,该软件可以从 Alpine 上的源代码构建。

  • 对于 LibreDWG,我们先来验证一下问题:
    /usr/local/bin # ./dwg2dxf
    /bin/sh: ./dwg2dxf: not found
    /usr/local/bin
    /usr/local/bin # ldd ./dwg2dxf
    /lib64/ld-linux-x86-64.so.2 (0x7fd375538000)
    libredwg.so.0 => /usr/local/lib/libredwg.so.0 (0x7fd3744db000)
    libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fd375538000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fd375538000)
    Error relocating /usr/local/lib/libredwg.so.0: __strcat_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __snprintf_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __memcpy_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __stpcpy_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __strcpy_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __printf_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __fprintf_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __strncat_chk: symbol not found
    Error relocating /usr/local/lib/libredwg.so.0: __sprintf_chk: symbol not found
    Error relocating ./dwg2dxf: __snprintf_chk: symbol not found
    Error relocating ./dwg2dxf: __printf_chk: symbol not found
    Error relocating ./dwg2dxf: __fprintf_chk: symbol not found
    可以看到 dwg2dxf 依赖于几个 glibc 符号。
    现在,让我们按照选项 2 安装 glibc:
    /usr/src/app # cd /usr/local/bin
    /usr/local/bin # ls
    dwg2SVG dwg2dxf dwgadd dwgbmp dwgfilter dwggrep dwglayers dwgread dwgrewrite dwgwrite dxf2dwg dxfwrite
    /usr/local/bin # ./dwg2dxf
    /bin/sh: ./dwg2dxf: not found
    /usr/local/bin # export GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc && \
    > export GLIBC_VERSION=2.30-r0 && \
    > 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
    fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
    fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
    (1/1) Installing curl (7.74.0-r1)
    Executing busybox-1.32.1-r3.trigger
    OK: 629 MiB in 126 packages
    (1/2) Installing glibc (2.30-r0)
    (2/2) Installing glibc-bin (2.30-r0)
    Executing glibc-bin-2.30-r0.trigger
    /usr/glibc-compat/sbin/ldconfig: /usr/local/lib/libredwg.so.0 is not a symbolic link
    /usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link
    OK: 640 MiB in 128 packages
    removed '/tmp/glibc-2.30-r0.apk'
    removed '/tmp/glibc-bin-2.30-r0.apk'
    /usr/glibc-compat/sbin/ldconfig: /usr/glibc-compat/lib/ld-linux-x86-64.so.2 is not a symbolic link

    /usr/glibc-compat/sbin/ldconfig: /usr/local/lib/libredwg.so.0 is not a symbolic link
    瞧:
    /usr/local/bin # ./dwg2dxf

    Usage: dwg2dxf [-v[N]] [--as rNNNN] [-m|--minimal] [-b|--binary] DWGFILES...

    关于linux - 即使在 PATH 中也找不到 Docker Alpine 可执行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66963068/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com