【发布时间】:2022-02-23 11:43:26
【问题描述】:
我有一个高山运行容器,其中包含usr/local/bin 中的一些二进制文件
当我lsusr/local/bin 的内容时,我得到了这个输出:
/usr/local/bin # ls
dwg2SVG dwg2dxf dwgadd dwgbmp dwgfilter dwggrep dwglayers dwgread dwgrewrite dwgwrite dxf2dwg dxfwrite
这是我所期望的。
但是,如果我通过调用它来执行其中一个二进制文件,我会从 shell 收到 not found 错误:
/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 构建中的某些内容?
我想 alpine 中的 ldconfig 命令出了点问题,但我不确定。
编辑
正如这里的一个答案所建议的,我执行了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/
【问题讨论】:
-
如果您尝试使用绝对路径执行它会怎样?:
/usr/local/bin/dwg2dxf另外,$PATH是否导出以便dwg2dxf也看到它,因为错误是dwgread: not found就像@987654338 @ 找不到要执行的dwgread。 -
@jossefaz :我注意到您的问题中有两件奇怪的事情:首先您将其标记为 bash,但您收到的错误消息并非来自 bash。您不会测试与您执行的命令相关的 PATH 。为了安全起见,我会做一个
(printenv PATH; ls -l /usr/local/bin/dwg2dxf; dwg2dxf)。 -
@user1934428 :我更新了问题标签。对于第二点,我将尝试使用输出编辑 ;y 问题。但我认为通过在我的 dockerfile 中使用另一个基本映像,我已经接近解决方法......
-
您能否编辑问题以直接包含 Dockerfile,而不是在链接后面?二进制文件来自哪里?切换到 Ubuntu 基础可能会解决此类问题,或者您可能缺少一些需要安装的共享库依赖项。
-
@DavidMaze :感谢您的评论。我已经编辑了我的问题整个 Dockefile 以及这些二进制文件来自的官方存储库的链接。实际上,我在一小时前确实更改了基本图像并且它起作用了。但这对我来说不是一个理想的解决方案。但是由于它有效并且可以帮助其他人,所以我发布了这个解决方法作为对我自己问题的回应......如果有人发现这个解决方法有任何改进,请随时发布另一个答案,我可以删除我的