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

时间:2018-07-24 22:03:22

标签: docker dockerfile docker-for-windows

当我在Windows 10上运行docker映像时,出现此错误:

standard_init_linux.go:190: exec user process caused "no such file or directory"

我的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"]

并且脚本以#!/ 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

尝试方法1: 尝试将#!/ bin / sh更改为#!/ bin / bash ,但出现相同的错误。

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

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh

21 个答案:

答案 0 :(得分:44)

使用记事本++,进行编辑-> EOL转换->从CRLF更改为LF。

答案 1 :(得分:30)

更改入口点如下。对我有用

ENTRYPOINT ["sh","/run.sh"]

答案 2 :(得分:16)

假设在高山容器中运行go二进制文件时遇到此问题。在构建容器之前导出以下变量

# CGO has to be disabled for alpine
export CGO_ENABLED=0

然后go build

答案 3 :(得分:9)

对于我来说,我必须将CRLF文件的行从LF更改为run.sh,错误消失了。

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

答案 4 :(得分:6)

由于我的代表,我无法发表评论,但我只想添加:对于VSCode用户,您可以通过单击 CRLF 将CRLF行尾更改为LF >在状态栏中,然后选择 LF 并保存文件。

我遇到了同样的问题,并且此问题得以解决。 Steps to follow for VSCode

答案 5 :(得分:4)

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

我的.sh文件的第一行如下:

#!/bin/bash

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

#!/bin/sh

或通过以下方式安装bash

apk add --no-cache bash

为我解决了这个问题。

答案 6 :(得分:3)

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

standard_init_linux.go:211: exec user process caused "no such file or directory"
如果构建映像的体系结构与您的系统不匹配,则会发生

。例如,尝试在arm64的计算机上运行为x86_64构建的映像会产生此错误。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

我在 ARM 机器上基于 x86 构建 docker 映像时遇到了相同的错误消息。问题通过安装QEMU和注册脚本解决

#Install the qemu     
sudo apt-get install qemu binfmt-support qemu-user-static packages

#This step will execute the registering scripts
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 

答案 9 :(得分:1)

这是一个CRLF问题。我使用此方法解决了这个问题:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix

答案 10 :(得分:1)

使用记事本++用LF替换CRLF

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

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

答案 11 :(得分:1)

这是因为shell脚本是windows格式的我们需要改成unix格式。 您可以在任何 Linux 系统上运行 dos2unix 命令。

dos2unix your-file.sh

如果您无法访问 Linux 系统,您可以使用带有 dos2unix.exe 的 Git Bash for Windows

dos2unix.exe your-file.sh 

答案 12 :(得分:0)

您可以在 Mac 上使用 BBEdit 来解决此问题,因为 Notepad++ 不可用。

它在窗口底部很明显。除了字符集选项

答案 13 :(得分:0)

我的 .sh 文件末尾多了一行。我删除了它并解决了问题。

答案 14 :(得分:0)

对于 VScode 用户,在 IDE 的右下角,您可以找到CRLF/LF,因此将其切换为 LF 并再次保存您的文件。多田!!你会没事的。

enter image description here

答案 15 :(得分:0)

我解决了一个类似的问题

我的配置: -> Docker 桌面 WSL 2 后端 - Windows -> 需要 CGO_ENABLED=1,因为我使用 Lib 编译了一个 Kafka Producer confluent-kafka-go.v1/kafka

我的 docker 镜像已经构建成功,但是当我使用 docker-compose-up 启动镜像时,出现同样的问题:

xxxxx:~/cp-all-in-one/cp-all-in-one-community# docker-compose up
Recreating ms-c3alert ... done
Attaching to ms-c3alert
ms-c3alert | standard_init_linux.go:211: exec user process caused "no such file or directory"
ms-c3alert exited with code 1

之后,测试线程和其他页面中的所有选项...我发现在 go build 语句中添加了 Fix -ldflags='-w -extldflags "-static"'

RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags='-w -extldflags "-static"' -a -installsuffix cgo -o c3alert .

答案 16 :(得分:0)

这里有多个正确答案。我没有看到它的 VIM 版本,所以在这里。在 VIM 中打开您的文件,检查底部状态行 for example,执行 set ff=dos(对于 CRLF)或 set ff=unix(对于 LF)。

答案 17 :(得分:0)

我发现一个特殊的极端情况是我在tini init容器中使用alpine,但是由于我没有使用静态链接版本,并且默认情况下安装了Alpine uses musl libc rather than GNU LibC library崩溃并显示了相同的错误消息。

如果我理解了这一点,并且还花了一些时间正确阅读文档,我会发现Tini Static可以解决此问题。

答案 18 :(得分:0)

我解决了这个问题,请在vscode中设置我的设置。

  1. 文件
    1. 首选项
      1. 设置
        1. 文本编辑器
          1. 文件
          2. Eol-设置为\ n

致谢

答案 19 :(得分:0)

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

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

下一个原因是运行错误的命令。这通常与无法正确解析的要运行的命令的json / exec格式一起出现。如果您看到命令尝试运行["app",或类似命令,则说明Docker尚未解析json字符串,Linux则尝试使用shell将命令解析为字符串。如果您对arg进行了错误排序(例如,尝试运行-it是一个标志,您试图将标志放置在图像名称之后,但必须将其放置在图像名称之前。

在使用shell脚本时,如果带有#!的第一行指向容器中不存在的命令,则会出现此错误。对于某些人来说,这试图在仅包含bash的映像中运行/bin/sh。根据您的情况,这可以来自脚本中的Windows换行。在您的编辑器中切换到Linux / Unix换行符将纠正该问题。

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

答案 20 :(得分:0)

将此添加到您的Dockerfile

RUN cat /run.sh | tr -d '\r' > /run.sh