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

问题描述 投票:30回答:8

当我在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
docker dockerfile docker-for-windows
8个回答
54
投票

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


34
投票

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

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

正如tuomastik指出in the commentsthe docs要求第一个参数是可执行文件:

ENTRYPOINT有两种形式:

ENTRYPOINT ["executable", "param1", "param2"](执行形式,首选)

ENTRYPOINT command param1 param2(贝壳形式)


11
投票

在我的情况下,我不得不将CRLF的行结尾更改为LF文件的run.sh,错误消失了。

我希望这有帮助, 基尔斯滕


5
投票

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

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

#!/bin/bash

阿尔卑斯山没有bash。所以改变行

#!/bin/sh

或安装bash

apk add --no-cache bash

为我解决了这个问题。


2
投票

使用Notepad ++用LF替换CRLF

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

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


2
投票

这是一个CRLF问题。我用这个修复了问题:

git config --global core.eol lf

git config --global core.autocrlf input

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

0
投票

将其添加到Dockerfile

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

0
投票

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

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

下一个原因是运行错误的命令。这经常出现在运行命令的json / exec格式中,无法正确解析。如果你看到一个命令试图运行["app",或类似的东西,那么json字符串不会被Docker解析,Linux正在尝试使用shell将命令解析为字符串。如果您对args进行了错误排序,例如试图运行-it是一个标志,你试图在图像名称后放置标志,当它们必须放在图像名称之前。

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

使用二进制文件时,如果缺少链接库,则会出现此错误。我经常在使用libc编译的Go命令时看到这个,但是在使用musl的高山上运行或者在没有任何库的情况下进行刮擦。您需要包含所有缺少的库或静态编译命令。要查看这些库链接,请在二进制文件上使用ldd /your/app

© www.soinside.com 2019 - 2024. All rights reserved.