standard_init_linux.go:190:exec用户进程导致"没有这样的文件或目录"--Docker

gam*_*r17 44 docker dockerfile docker-for-windows

当我在Windows 10上运行我的docker镜像时,我收到此错误:

standard_init_linux.go:190: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

我的docker文件是:

FROM openjdk:8

EXPOSE 8080

VOLUME /tmp

ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh

# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl

# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]
Run Code Online (Sandbox Code Playgroud)

并且脚本以#!/ bin/sh开头

#!/bin/sh
set -e

JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"

if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi

exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar
Run Code Online (Sandbox Code Playgroud)

尝试方法1: 尝试将#!/ bin/sh更改为#!/ bin/bash,但得到相同的错误.

尝试方法2:在docker文件中添加了dos2unix

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
Run Code Online (Sandbox Code Playgroud)

Vik*_*ore 69

使用notepad ++,转到编辑 - > EOL转换 - >从CRLF更改为LF.

  • 完美的!我添加了一个从我的 Dockerfile 运行的 .sh 文件。我替换了行尾和他打。谢谢 (12认同)
  • 您需要更改哪个文件?Dockerfile? (5认同)
  • 我在 Windows 上尝试构建和运行 ckan docker 映像时遇到此错误。如果您在克隆的存储库上遇到此问题,在克隆过程中使用 core.autocrlf 设置可能会很有用,如果是这样,请执行: `git config core.autocrlf input => (从存储库中删除了文件;不是确定 git reset 是否会重置换行符)=> git reset --hard` 复制自:https://github.com/LiveOverflow/PwnAdventure3/issues/11 (3认同)
  • @Gloweye:不。您在入口点传递的文件。在上面的例子中/run.sh (3认同)
  • @VikasRathore 在这种情况下,可能值得将其包含在答案中。 (3认同)
  • 我没有在“编辑选项卡”的记事本++中找到这个选项,但我已经改变了它,点击右下角写的 Windows(CR LF)按钮,我改为 Unix。非常感谢! (2认同)
  • 您也可以在 VS Code 中的右下角找到该设置 (2认同)
  • 挣扎了几个小时...感谢维卡斯节省了我的时间 (2认同)
  • 我总是将“dos2unix”添加到我的容器中,并在我“添加”到其中的每个文本文件上运行它。如果其他同事忘记更改编辑器中的行结尾,这是最可靠的解决方案。 (2认同)

aru*_*net 50

假设您在 alpine 容器中运行 go 二进制文件时遇到了这个问题。在构建 bin 之前导出以下变量

# CGO has to be disabled for alpine
export CGO_ENABLED=0
Run Code Online (Sandbox Code Playgroud)

然后 go build

  • 比禁用 CGo(可能会产生一系列负面影响)更好的解决方案是安装 Go 二进制文件正在寻找的共享库。在 Alpine 中,这通常可以通过在 Dockerfile 中添加 RUN apk add --no-cache libc6-compat 来安装 glibc 兼容性库来实现。 (4认同)
  • 在 Dockerfile 中,在 go build 行之前添加 ENV CGO_ENABLED=0 。这对我有用。 (2认同)

小智 42

改变入口点如下.它对我有用

ENTRYPOINT ["sh","/run.sh"]
Run Code Online (Sandbox Code Playgroud)

  • 你能解释为什么以及何时需要"sh"?我看到许多例子没有工作. (6认同)
  • @Opsse 如果没有 `"sh"`,则不会发生正常的 shell 处理 [来源](https://docs.docker.com/engine/reference/builder/#entrypoint) (2认同)
  • 事实证明,在我的 ENTRYPOINT 脚本中,我使用 `/bin/bash` 作为 shell 解释器,但由于我的图像是基于 alpine 的,所以它没有附带它。我将脚本“bash”更改为“sh”,问题得到解决。 (2认同)

Kir*_*one 12

在我的情况,我不得不改变从结束行CRLF至LF该run.sh文件和错误不见了.

我希望这会
有所帮助,克尔斯滕


Ami*_*Dev 12

这是一个 CRLF 问题。我用这个解决了这个问题:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix
Run Code Online (Sandbox Code Playgroud)


Xel*_*ron 12

我只是想补充一点:对于 VSCode 用户,您可以通过单击状态栏中的CRLF将 CRLF 行尾更改为 LF ,然后选择LF并保存文件。

我有同样的问题,这解决了它。 VSCode 的步骤


daB*_*bby 11

使用alpine图像时,我遇到了同样的问题。

我的.sh文件具有以下第一行:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

高山没有重击。因此将线更改为

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

或安装bash

apk add --no-cache bash
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题。

  • 这!在 Apline 的 Docker Hub 页面上应以粗体显示。 (5认同)

BMi*_*tch 11

“没有这样的文件或目录”来自 Linux,我看到了以下原因:

第一个原因实际上是在容器中没有文件。有些人尝试从主机运行命令而不将其添加到他们的图像中。有些人通过在他们想要运行的命令之上安装一个卷来隐藏他们的命令。如果您运行相同的容器,但使用 shell 而不是您的正常入口点/cmd 值,然后运行ls /path/to/cmd您会看到它是否存在。

下一个原因是运行错误的命令。这通常与 json/exec 格式的命令一起出现,该命令无法正确解析。如果您看到尝试运行的命令["app",或类似的命令,则 Docker 未解析 json 字符串,并且 Linux 正在尝试使用 shell 将命令解析为字符串。如果您对 args 进行了错误排序,也会发生这种情况,例如,尝试运行-it是您尝试在图像名称之后放置标志的标志,而它们必须放置在图像名称之前。

对于 shell 脚本,如果第一行#!指向容器内不存在的命令,则会出现此错误。对于某些人来说,这是试图bash在只有/bin/sh. 在您的情况下,这可以来自脚本中的 Windows 换行符。在您的编辑器中切换到 Linux/Unix 换行符将纠正这一点。

对于二进制文件,如果缺少链接库,则会出现此错误。当使用 编译的 Go 命令时,我经常看到这种情况libc,但在 alpine 上运行时使用musl或从头开始,根本没有任何库。您需要包含所有缺少的库或静态编译您的命令。要查看这些库链接,请ldd /your/app在您的二进制文件上使用。

  • 谢谢!对于我的临时映像中的 go 应用程序,必须使用 CGO_ENABLED=0 进行重建 (3认同)

LoW*_*LoW 8

请注意类似的错误,例如:

standard_init_linux.go:211: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

如果构建映像的架构与您的系统不匹配,则可能会发生这种情况。例如,尝试arm64在x86_64机器上运行构建的映像可能会产生此错误。


Aar*_*uss 6

我正在构建一个Go应用程序,这些答案对我来说都是错误的,所以我想分享我的解决方案。对我来说,我有一个与 Windows 无关的 Dockerfile(在 Mac 上编码,尽管在 macOS 11 上的一个和 macOS 12 上的另一个之间共享。不过行结尾是相同的)。

对我来说,解决方案最终是我需要将应用程序构建为静态链接的二进制文件,无需外部依赖即可运行。我正在为 Go 应用程序构建 Dockerfile,该应用程序首先构建在 Go 构建器映像中,然后构建在临时映像中。为了让我的二进制文件能够从头开始运行,我必须添加该CGO_ENABLED=0 标志。有关此 Reddit 页面的更多信息:https://www.reddit.com/r/golang/comments/pi97sp/comment/hbo0fq6/ ?utm_source=share&utm_medium=web2x&context=3

我的代码最终有效:

############################
# STEP 1 build optimized executable binary
############################
FROM golang:1.16-alpine AS builder

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o cl-api

############################
# STEP 2 build a small image
############################
FROM scratch

COPY --from=builder /app/cl-api /

EXPOSE 8000

ENTRYPOINT ["/cl-api"]

Run Code Online (Sandbox Code Playgroud)


Raj*_*esh 5

使用 Notepad++ 用 LF 替换 CRLF

  1. Notepad++ 的查找/替换功能很好地处理了这个需求。只需打开替换对话框(CTRL+H),选择扩展搜索模式(ALT+X),搜索“\r\n”并替换为“\n”:
  2. 全部替换 (ALT+A)

重新构建并运行 docker 镜像应该可以解决您的问题。


Nai*_*j29 5

我在使用 CGO 构建应用程序然后将其复制到scratch图像时遇到了这个问题。Libc 在那里不存在,所以我用它alpine作为我的基础镜像。