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


123

当我在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

Answers:


176

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


5
完善!我添加了一个.sh文件,该文件正在从Dockerfile运行。我替换了行尾和Ta Da。谢谢
Sweet Chilly Philly,

我没有在“编辑选项卡”中的notepad ++中找到此选项,但单击了Windows(CR LF)右下角的按钮,将其更改为Unix。非常感谢!
Tobo

我有同样的问题,可以按照您的建议解决。非常感谢你!
trueblue82

谢谢!运行良好!我也遇到同样的问题。
ironrainbow19年

2
尝试在Windows上构建和运行ckan docker映像时出现此错误。如果您在克隆的存储库上遇到此问题,则在克隆期间使用core.autocrlf设置可能会很有用,如果是这样,请执行:git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hard复制自:github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G

70

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

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

正如tuomastik在评论中指出的那样,文档要求第一个参数是可执行文件:

ENTRYPOINT有两种形式:

ENTRYPOINT ["executable", "param1", "param2"] (执行表格,首选)

ENTRYPOINT command param1 param2 (外壳形式)


为我工作。在这种情况下,我们甚至不需要在shell脚本中添加#!/ bin / sh。在ENTRYPOINT中提及“ sh”即可完成工作
Gouravmoy Mohanty,

10
您能否解释为什么以及何时需要“ sh”?我看到许多没有工作的例子。
Opsse

1
@Opsse没有"sh",正常壳处理不会发生
tuomastik

2
原来,在我的ENTRYPOINT脚本中,我/bin/bash用作外壳解释器,但是由于我的映像是基于Alpine的,所以它没有附带。我在剧本改bashsh和问题就解决了。
morpheuz

63

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

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

#!/bin/bash

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

#!/bin/sh

或安装bash

apk add --no-cache bash

为我解决了这个问题。


2
这个!在Apline的Docker Hub页面上应以粗体显示。
哈希锁

是的,就是这样。如果您正在使用entrypoint.sh带有Alpinedocker image的文件,请使用#!/bin/sh而不是bash!
弗拉基米尔

17

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

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

然后 go build


在Dockerfile中,这是在go build行之前添加ENV CGO_ENABLED = 0。这对我有用。
Madhan Ganesh

因此在Dockerfile中应该是:RUN export CGO_ENABLED=0 && go build
BMW

16

就我而言,我必须将文件的结尾行从CRLF更改LFrun.sh,错误消失了。

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


1
我必须不断地修复相同的文件。就像Windows想要让我进入它的生态系统一样。
Jonathan Czitkovics

@JonathanCzitkovics也许您应该检查您的git配置和代码编辑器的设置
KirKone19,2013年

9

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

git config --global core.eol lf

git config --global core.autocrlf input

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

十分感谢!它挽救了我的一天。
亚历克斯

8

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

第一个原因实际上不是文件包含在容器中。有些人尝试从主机运行命令而不将其添加到其映像中。有些人通过在要运行的命令之上安装一个卷来遮蔽其命令。如果运行相同的容器,但使用外壳程序而不是正常的入口点/ 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在您的二进制文件上使用。


3
谢谢!对于我的暂存图像中的go应用程序,必须使用CGO_ENABLED = 0进行重建
Manuel Rony Gomes,

我的情况:1.可执行二进制文件是从alpine构建的,但是运行go命令的基本映像是debian,因此发生了错误。
inix

6

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

我遇到了同样的问题,并且此问题得以解决。 VSCode遵循的步骤


4

使用记事本++将LF替换为LF

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

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


3

注意类似的错误,例如:

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

如果构建映像的体系结构与您的系统不匹配,则会发生这种情况。例如,尝试运行arm64x86_64计算机上构建的映像可能会产生此错误。


1
感谢您的撰写。这使我意识到我正在使用ubuntu进行构建,并与alpine一起运行,而alpine大概缺少了一些需要的东西。
基普


0

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

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

问候


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.