【问题标题】:File not found in Alpine Container, despite existing尽管存在文件,但在 Alpine Container 中找不到文件
【发布时间】:2021-08-03 12:48:17
【问题描述】:

我有一个 Alpine 容器,我将二进制文件复制到该容器(在本例中为 spar)。入口点是dumb-init /usr/bin/spar,但结果是No such file or directory。当我在容器内运行sh 时,/usr/bin/spar 存在。尝试运行它

  1. dumb-init ...
  2. /usr/bin/spar / spar 来自/
  3. ./spar / spar 来自usr/bin/

所有都会导致相同的错误。我尝试使用chmod 777 /usr/bin/spar 更改权限,让每个人都可以完全访问,但还是没有运气。

我是否遗漏了 alpine 特有的内容?在另一个 SO 问题中,有人提到从 Alpine 切换到 Ubuntu 解决了他们的问题,但没有提供更多信息。

这是创建图像的 dockerfile

ARG intermediate=quay.io/wire/alpine-intermediate
ARG deps=quay.io/wire/alpine-deps

#--- Intermediate stage ---
FROM ${intermediate} as intermediate

#--- Minified stage ---
FROM ${deps}

ARG executable
ENV CACHEDEXECUTABLE ${executable}

COPY --from=intermediate /dist/${executable} /usr/bin/${executable}

# TODO: only if executable=brig, also copy templates. Docker image conditionals seem hacky:
# https://stackoverflow.com/questions/31528384/conditional-copy-add-in-dockerfile
# For now, adds ~2 MB of additional files into every container
COPY --from=intermediate /dist/templates/ /usr/share/wire/templates/

# ARGs are not available at runtime, create symlink at build time
# more info: https://stackoverflow.com/questions/40902445/using-variable-interpolation-in-string-in-docker
RUN ln -s /usr/bin/${executable} /usr/bin/service
ENTRYPOINT /usr/bin/dumb-init /usr/bin/${CACHEDEXECUTABLE}

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?如果它是动态链接的二进制文件,那么如果共享库或加载器不存在,您就可以获得该消息;如果它是一个脚本,如果脚本解释器不可用或脚本错误地具有 DOS 行结尾,您也会收到该错误。
  • 你在运行什么镜像?你有要展示的 Dockerfile 吗?运行容器时是否在 /usr/bin 路径上映射任何卷?
  • @DavidMaze spar 是一个复制粘贴的二进制文件,它存在于目录中,但是当我尝试运行它时说它不存在,当我尝试 cat 它时,我得到一个输出二进制数据。 (由于要达到这一点需要很多步骤,因此很难重现)
  • @HansKilian 我已经添加了 dockerfile,如果有帮助,我也可以上传图像。我不认为我在映射任何卷

标签: linux docker alpine


【解决方案1】:

如果 spar 是二进制文件,该二进制文件存在于容器中,而您直接调用它或它位于容器路径中,则找不到文件的两个可能原因是:

  1. 容器内不存在的动态链接库。例如。你们中的谁运行ldd spar,它会向您显示这些链接,尽管您尝试在使用 musl 的 Alpine 上运行,但您很有可能会看到 libc。

  2. 二进制文件用于另一个平台/架构,并且您有 binfmt_misc 设置,但没有 --fix-binary 选项,因此它在容器文件系统而不是主机中寻找解释器路径。通过在该平台的 /proc 文件中缺少 F 标志,可以看出这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多