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

尝试method1: 试着改变#!/bin/sh到#!/bin/bash但是得到同样的错误。

尝试method2: docker文件中新增dos2unix

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

当前回答

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

我也有同样的问题,这个解决了问题。

其他回答

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

dos2unix your-file.sh

如果你不能访问Linux系统,你可以使用Git Bash for Windows,它带有dos2unix.exe

dos2unix.exe your-file.sh 

将其添加到Dockerfile中

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

在我的例子中,我不得不将run.sh文件的行尾从CRLF更改为LF,错误就消失了。

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

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

如果为其构建映像的体系结构与您的系统不匹配,就会发生这种情况。例如,试图在x86_64机器上运行为arm64构建的映像会生成此错误。

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

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

然后去构建