[docker] standard_init_linux.go : 190 : exec 사용자 프로세스로 인해 “해당 파일 또는 디렉토리 없음”발생-Docker
Windows 10에서 도커 이미지를 실행할 때이 오류가 발생합니다.
standard_init_linux.go:190: exec user process caused "no such file or directory"
내 도커 파일은 다음과 같습니다.
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로 변경하려고했습니다. 했지만 동일한 오류가 발생했습니다.
시도한 method2 : docker 파일에 dos2unix 추가
RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
답변
메모장 ++을 사용하여 편집-> EOL 변환-> CRLF에서 LF로 변경하십시오.
답변
답변
alpine
이미지를 사용할 때 동일한 문제가 발생했습니다 .
내 .sh
파일에는 다음과 같은 첫 번째 줄이 있습니다.
#!/bin/bash
Alpine에는 bash가 없습니다. 그래서 라인을
#!/bin/sh
또는 bash 설치
apk add --no-cache bash
나를 위해 문제를 해결했습니다.
답변
알파인 컨테이너에서 go 바이너리를 실행하는 동안이 문제에 직면했다고 가정합니다. 저장소를 만들기 전에 다음 변수를 내 보냅니다.
# CGO has to be disabled for alpine
export CGO_ENABLED=0
그때 go build
답변
제 경우에는 줄 끝을에서 CRLF
로 변경 해야 LF
했습니다.run.sh
파일 및 오류가 사라졌다.
도움이
되었기를 바랍니다. Kirsten
답변
CRLF 문제입니다. 이것을 사용하여 문제를 해결했습니다.
git config --global core.eol lf
git config --global core.autocrlf input
find . -type f -print0 | xargs -0 dos2unix
답변
“해당 파일 또는 디렉토리 없음”은 Linux에서 제공되며 다음 원인을 확인했습니다.
첫 번째 원인은 실제로 컨테이너 내부에 파일이없는 것입니다. 어떤 사람들은 이미지에 추가하지 않고 호스트에서 명령을 실행하려고합니다. 어떤 사람들은 실행하려는 명령 위에 볼륨을 마운트하여 명령을 숨 깁니다. 동일한 컨테이너를 실행하지만 일반 진입 점 / cmd 값 대신 셸을 사용하고ls /path/to/cmd
하면 이것이 존재하는지 확인할 수 있습니다.
다음 원인은 잘못된 명령을 실행하는 것입니다. 이것은 종종 올바르게 구문 분석되지 않는 명령의 json / exec 형식으로 나타납니다. 실행을 시도하는 명령 ["app",
이나 이와 유사한 것을 발견하면 Docker에서 json 문자열을 구문 분석하지 않았으며 Linux는 명령을 문자열로 구문 분석하기 위해 셸을 사용하려고합니다. 이는 인수를 잘못 정렬 한 경우에도 발생할 수 있습니다. 예를 들어 실행 -it
을 시도하는 것은 이미지 이름 앞에 플래그를 배치해야 할 때 이미지 이름 뒤에 플래그를 배치 하려는 신호입니다.
셸 스크립트를 사용하는 경우이 오류는 첫 번째 줄 #!
이 컨테이너 내에 존재하지 않는 명령을 가리키는 경우 나타납니다 . 일부의 경우이 bash
이미지 만있는 이미지에서 실행하려고합니다./bin/sh
. 그리고 귀하의 경우 스크립트의 Windows 줄 바꿈에서 가져올 수 있습니다. 편집기에서 Linux / Unix 라인 피드로 전환하면 문제가 해결됩니다.
바이너리의 경우 연결된 라이브러리가없는 경우이 오류가 나타납니다. 으로 컴파일 libc
되었지만 musl
라이브러리가 전혀 없거나 전혀없는 스크래치 에서 실행 되는 Go 명령을 자주 보았습니다 . 누락 된 모든 라이브러리를 포함하거나 명령을 정적으로 컴파일해야합니다. 이러한 라이브러리 링크를 보려면 ldd /your/app
바이너리 에서 사용 하십시오.