standard_init_linux.go : 190 : exec 사용자 프로세스로 인해 "해당 파일 또는 디렉토리 없음"발생-Docker


123

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

답변:


180

메모장 ++을 사용하여 편집-> EOL 변환-> CRLF에서 LF로 변경하십시오.


6
완전한! Dockerfile에서 실행중인 .sh 파일이 추가되었습니다. 나는 라인 엔딩과 Ta Da를 교체했습니다. 감사합니다
Sweet Chilly Philly

'편집 탭'의 메모장 ++에서이 옵션을 찾지 못했지만 오른쪽 하단의 Windows (CR LF) 버튼을 클릭하여 변경하여 Unix로 변경했습니다. 감사합니다!
Tobo

나는 당신의 조언과 같은 문제를 가지고 있으며 그것을 해결합니다. 대단히 감사합니다!
truthblue82

감사합니다! 잘 작동했습니다! 나는 같은 문제로 고통 받고 있었다.
ironrainbow

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

71

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

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

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

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

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

ENTRYPOINT command param1 param2 (쉘 형태)


나를 위해 일했습니다. 이 경우 쉘 스크립트에 #! / bin / sh를 추가 할 필요조차 없습니다. 진입 점에서 "쉬"를 언급하는 것은 일을
Gouravmoy Mohanty

10
"sh"가 필요한 이유와시기를 설명해 주시겠습니까? 나는 많은 예가없이 작동하는 것을 보았다.
Opsse

1
@Opsse없이 "sh"정상 쉘 처리는 발생하지 않습니다 소스
tuomastik

2
내 ENTRYPOINT 스크립트에서 /bin/bash쉘 인터프리터 로 사용 하고 있었지만 내 이미지는 알파인 기반이므로 함께 제공되지 않았습니다. 나는 대본 bash을 바꾸고 sh문제를 해결했습니다.
morpheuz

63

alpine이미지를 사용할 때 동일한 문제가 발생했습니다 .

.sh파일에는 다음과 같은 첫 번째 줄이 있습니다.

#!/bin/bash

Alpine에는 bash가 없습니다. 그래서 라인을

#!/bin/sh

또는 bash 설치

apk add --no-cache bash

나를 위해 문제를 해결했습니다.


2
이! Apline의 Docker Hub 페이지에서 굵게 표시되어야합니다.
hashlock

네, 이것입니다. 도커 이미지가 있는 entrypoint.sh파일을 사용하는 경우 bash 대신 Alpine사용하십시오 #!/bin/sh!
Vladimir

18

알파인 컨테이너에서 go 바이너리를 실행하는 동안이 문제에 직면했다고 가정합니다. 저장소를 만들기 전에 다음 변수를 내 보냅니다.

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

그때 go build


Dockerfile 내에서 이것은 go 빌드 라인 앞에 ENV CGO_ENABLED = 0을 추가합니다. 이것은 나를 위해 일했습니다.
Madhan Ganesh

따라서 Dockerfile에서는 다음과 같아야합니다.RUN export CGO_ENABLED=0 && go build
BMW

16

제 경우에는 줄 끝을에서 CRLF로 변경 해야 LF했습니다.run.sh 파일 및 오류가 사라졌다.

도움이
되었기를 바랍니다. Kirsten


1
같은 파일을 계속해서 수정해야합니다. 마치 창문이 생태계에 나를 지키고 싶어하는 것과 같습니다.
Jonathan Czitkovics

@JonathanCzitkovics 어쩌면 당신은 당신의 자식 설정하고 코드 편집기에 대한 설정을 확인해야합니다
KirKone

9

CRLF 문제입니다. 이것을 사용하여 문제를 해결했습니다.

git config --global core.eol lf

git config --global core.autocrlf input

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

정말 고마워! 그것은 내 하루를 구했습니다.
Alex

8

"해당 파일 또는 디렉토리 없음"은 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바이너리 에서 사용 하십시오.


3
감사! 처음 이미지에서 내 이동 응용 프로그램의 경우, CGO_ENABLED = 0 사용하여 다시 작성해야했다
마누엘 RONY 고메스

내 사례 : 1. 실행 가능한 바이너리는 알파인에서 빌드되었지만 go 명령을 실행하는 기본 이미지는 데비안이므로 오류가 발생했습니다.
inix

6

내 담당자 때문에 댓글을 달 수는 없지만 추가하고 싶었 습니다 .VSCode 사용자의 경우 상태 표시 줄 에서 CRLF 를 클릭하여 CRLF 줄 끝을 LF로 변경 한 다음 LF 를 선택합니다. 하고 파일을 저장할 수 있습니다.

나는 같은 문제가 있었고 이것이 해결되었습니다. VSCode를 위해 따라야 할 단계


4

Notepad ++를 사용하여 CRLF를 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"

이미지가 빌드 된 아키텍처가 시스템의 아키텍처와 일치하지 않는 경우 발생할 수 있습니다. 예를 들어 머신 arm64에서 빌드 된 이미지를 실행하려고하면 x86_64이 오류가 발생할 수 있습니다.


1
작성해 주셔서 감사합니다. 그것은 내가 우분투로 건물을 짓고 있고 고산과 고산으로 달리는 것이 아마도 필요한 것을 놓치고 있다는 것을 깨달았습니다.
Kip


0

이 문제를 해결하여 vscode에서 내 설정을 설정합니다.

  1. 파일
    1. 환경 설정
      1. 설정
        1. 텍스트 에디터
          1. 파일
          2. Eol-\ n으로 설정

문안 인사


0

알파인 컨테이너 에서 tini init 를 사용하고 있었지만 정적으로 연결된 버전을 사용하지 않았기 때문에 Alpine은 GNU LibC 라이브러리가 아닌 musl libc를 사용 하는 특별한 경우를 발견했습니다. 기본적으로 설치된 경우를 발견했습니다. 에러 메시지.

이것을 이해하고 문서를 올바르게 읽는 데 시간이 걸렸다면 Tini Static 으로 변경하면 문제가 해결되었을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.