[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로 변경하십시오.


답변

아래와 같이 진입 점을 변경합니다. 그것은 나를 위해 일했습니다

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

tuomastik는 지적 코멘트에 , 워드 프로세서가 실행 될 첫 번째 매개 변수가 필요합니다 :

ENTRYPOINT에는 두 가지 형식이 있습니다.

ENTRYPOINT ["executable", "param1", "param2"] (exec 형식, 선호)

ENTRYPOINT command param1 param2 (쉘 형태)


답변

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바이너리 에서 사용 하십시오.