standard_init_linux.go:190: exec 사용자 프로세스로 인해 "해당 파일 또는 디렉터리가 없습니다" - 도커
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로 변경하려고 했지만 동일한 오류가 발생했습니다.
시도한 방법 2: 도커 파일에 dos2unix 추가
RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
메모장+를 사용하여 편집 -> EOL 변환 -> CRLF에서 LF로 변경합니다.
업데이트: VScode 사용자의 경우: 상태 표시줄에서 오른쪽 아래에 있는 CRLF를 클릭하여 CRLF를 LF로 변경할 수 있습니다.
나는 사용할 때 동일한 문제가 있었습니다.alpine
이미지
나의.sh
파일의 첫 번째 줄은 다음과 같습니다.
#!/bin/bash
알파인에는 bash가 없습니다.그래서 라인을 변경하는 것은
#!/bin/sh
또는 bash를 설치합니다.
apk add --no-cache bash
저를 위해 그 문제를 해결했습니다.
아래와 같이 진입점을 변경합니다.그것은 나에게 효과가 있었다.
ENTRYPOINT ["sh","/run.sh"]
tuomastik이 코멘트에서 지적했듯이, 문서에는 첫 번째 매개 변수가 실행 파일이 되어야 합니다.
엔트리 포인트에는 두 가지 형식이 있습니다.
ENTRYPOINT ["executable", "param1", "param2"]
양식,실행 양식, 기본 설정)
ENTRYPOINT command param1 param2
형태쉘형태))
알파인 컨테이너 내에서 바둑 바이너리를 실행하는 동안 이 문제가 발생한다고 가정합니다.휴지통을 만들기 전에 다음 변수 내보내기
# CGO has to be disabled for alpine
export CGO_ENABLED=0
그리고나서go build
저의 경우, 저는 줄 끝을 바꾸어야 했습니다.CRLF
LF
를해위를 .run.sh
파일과 오류가 사라졌습니다.
저는 단지 추가하고 싶었습니다: VSCode 사용자의 경우, 상태 표시줄에서 CRLF를 클릭하여 CRLF 줄 끝을 LF로 변경한 다음 LF를 선택하고 파일을 저장할 수 있습니다.
저도 같은 문제가 있었고, 이것으로 해결되었습니다.
Linux에서 "No sheat file or directory"(해당 파일 또는 디렉토리 없음)가 발생하고 있으며 다음과 같은 원인이 있습니다.
첫 번째 원인은 실제로 컨테이너에 파일이 들어 있지 않기 때문입니다.일부 사용자는 이미지에 명령을 추가하지 않고 호스트에서 명령을 실행하려고 합니다.일부 사용자는 실행할 명령어 위에 볼륨을 마운트하여 명령어를 음영 처리합니다.동일한 컨테이너를 실행하지만 일반 진입점/cmd 값 대신 셸을 사용하여 실행하는 경우ls /path/to/cmd
이것이 존재하는지 알게 될 것입니다.
다음 원인은 잘못된 명령을 실행하는 것입니다.이 문제는 종종 올바르게 구문 분석되지 않는 실행 명령의 json/exec 형식과 함께 나타납니다.를 ["app",
Json 문자열은 Docker에 의해 구문 분석되지 않았으며 Linux는 셸을 사용하여 명령을 문자열로 구문 분석하려고 합니다.예를 들어, Arg를 잘못 주문하는 경우에도 이 문제가 발생할 수 있습니다.-it
플래그를 이미지 이름 앞에 배치해야 하는 경우 이미지 이름 뒤에 배치하려고 한 기호입니다.
스크립트에서 이첫 번째 에 " " 의경우다트같, " 는음첫줄번표다시니에됩째은과셸이립오크스류▁the▁the▁with다▁with▁if▁appears,니▁line표시▁this▁error"가 있으면 나타납니다.#!
컨테이너 내부에 존재하지 않는 명령을 가리킵니다.어떤 사람들에게는, 이것은 실행하려고 합니다.bash
▁has만 에서./bin/sh
이 경우 스크립트의 Windows 회선 피드에서 발생할 수 있습니다.편집기에서 Linux/Unix 라인피드로 전환하면 수정됩니다.
바이너리의 경우 연결된 라이브러리가 누락된 경우 이 오류가 나타납니다.저는 바둑 명령어들이 다음과 같이 컴파일될 때 이것을 자주 보았습니다.libc
하지만 알파인에서 달리는 것은musl
도서관 없이 긁거나 할 수도 있습니다.누락된 라이브러리를 모두 포함하거나 명령을 정적으로 컴파일해야 합니다.이러한 라이브러리 링크를 보려면 다음을 사용하십시오.ldd /your/app
당신의 바이너리에.
다음과 같은 유사한 오류를 기록합니다.
standard_init_linux.go:211: exec user process caused "no such file or directory"
이미지가 구축된 아키텍처가 시스템의 아키텍처와 일치하지 않을 경우 발생할 수 있습니다.예를 들어, 다음을 위해 빌드된 이미지를 실행하려고 시도합니다.arm64
에서.x86_64
컴퓨터가 이 오류를 발생시킬 수 있습니다.
CRLF 문제입니다.다음을 사용하여 문제를 해결했습니다.
git config --global core.eol lf
git config --global core.autocrlf input
find . -type f -print0 | xargs -0 dos2unix
를 사용하여 할 때 이했습니다.scratch
미지이를 했습니다. Libc는 그곳에 존재하지 않아서 사용했습니다.alpine
대신에 제 기본 이미지로.
메모장++을 사용하여 CRLF를 LF로 바꾸기
- 메모장++의 찾기/바꾸기 기능은 이 요구사항을 매우 잘 처리합니다.바꾸기 대화 상자(CTRL+H)를 열고 확장 검색 모드(ALT+X)를 선택한 다음 "\r\n"을 검색하고 "\n"으로 바꾸기만 하면 됩니다.
- 모두 바꾸기(ALT+A)를 누릅니다.
도커 이미지를 다시 빌드하고 실행하면 문제가 해결됩니다.
저는 바둑 애플리케이션을 만들고 있었는데, 이 모든 답들이 저에게 맞지 않았습니다. 그래서 저는 제 해결책을 공유하고 싶었습니다.저의 경우 Windows와 관련이 없는 Docker 파일이 있었습니다(MacOS 11과 MacOS 12의 다른 파일 간에 공유되긴 했지만 Mac에서 코드화됨). 줄 끝은 동일합니다.
결국 외부 의존성 없이 실행되는 정적으로 연결된 바이너리로 애플리케이션을 구축해야 했습니다.저는 바둑 응용 프로그램을 위한 도커 파일을 만들고 있었습니다. 처음에는 바둑 제작자 이미지로, 그 다음에는 스크래치 이미지로 만들어졌습니다.내 이진 파일이 스크래치에서 실행되도록 하려면 다음을 추가해야 했습니다.CGO_ENABLED=0
플래그. 이 레딧 페이지에 대한 자세한 정보: https://www.reddit.com/r/golang/comments/pi97sp/comment/hbo0fq6/ ?utm_source=share&utm_medium=web2x&timeout=3
작동하게 된 내 코드:
############################
# STEP 1 build optimized executable binary
############################
FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o cl-api
############################
# STEP 2 build a small image
############################
FROM scratch
COPY --from=builder /app/cl-api /
EXPOSE 8000
ENTRYPOINT ["/cl-api"]
셸 스크립트가 창에서 포맷되어 있기 때문에 unix 형식으로 변경해야 합니다.모든 Linux 시스템에서 dos2unix 명령을 실행할 수 있습니다.
dos2unix your-file.sh
Linux 시스템에 액세스할 수 없는 경우 dos2unix.exe와 함께 제공되는 Windows용 Git Bash를 사용할 수 있습니다.
dos2unix.exe your-file.sh
다음을 기반으로 도커 이미지를 구축하는 동안 동일한 오류 메시지가 표시되었습니다.ARM
x86
를 됩니다.EMU를 설치하고 스크립트를 등록하면 문제가 해결됩니다.
#Install the qemu
sudo apt-get install qemu binfmt-support qemu-user-static packages
#This step will execute the registering scripts
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
문제:
문제는 .sh 파일에서 발생합니다.먼저 Windows는 \r\n을 줄의 끝으로 사용하는 반면 Linux와 Mac은 \n을 사용합니다.Git에는 Windows에서 일반적으로 "true"로 설정된 autoclrf라는 기능이 있습니다.이것은 Git 저장소에서 다운로드가 완료되면 \n을 \r\n으로 자동 변환하지만 Git는 이에 대해 어떠한 통지도 하지 않으므로 오류가 발생합니다.이 프로세스는 적어도 다른 파일의 경우에는 좋지만 진입점의 경우와 마찬가지로 bash 파일의 경우는 아닙니다.sh 파일.
즉각적인 솔루션:
즐겨찾는 코드 편집기를 열고 충돌을 일으키는 파일의 줄 끝을 변경합니다. 이 경우 entrypoint.sh .소프트웨어 오른쪽 아래에 있는 Visual Studio Code에서 CRLF라고 표시된 위치를 클릭하고 파일 줄의 끝을 LF로 변경할 수 있습니다.
아래 링크에서 영구 솔루션에 대한 전체 게시물을 읽으십시오.
VScode 사용자의 경우 IDE의 오른쪽 하단 모서리에 CRLF/LF가 있으므로 이를 LF로 전환하고 파일을 다시 저장합니다.타다!괜찮을 겁니다.
도커 파일에 추가
RUN cat /run.sh | tr -d '\r' > /run.sh
나는 비슷한 문제를 해결합니다.
내 구성: -> Docker Desktop WSL 2 백엔드 - Windows -> Lib confluent-kafka-go.v1/kafka를 사용하여 Kafka Producer를 컴파일하므로 CGO_ENABLED=1이 필요합니다.
내 도커 이미지는 빌드에 성공했지만 도커 합성을 사용하여 이미지를 시작하려고 하면 동일한 문제가 발생합니다.
xxxxx:~/cp-all-in-one/cp-all-in-one-community# docker-compose up
Recreating ms-c3alert ... done
Attaching to ms-c3alert
ms-c3alert | standard_init_linux.go:211: exec user process caused "no such file or directory"
ms-c3alert exited with code 1
그런 다음 스레드 및 다른 페이지에서 모든 옵션을 테스트합니다.Go build 문장 -ldflags='-w-extldflags "-static"에 Fix가 추가되어 있는 것을 발견했습니다.
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags='-w -extldflags "-static"' -a -installsuffix cgo -o c3alert .
나는 내 마지막에 여분의 줄이 있었습니다..sh
파일을 삭제하고 문제를 해결했습니다.
이 오류는 from-scratch 컨테이너에서 동적으로 연결된 실행 파일을 실행하려고 할 때도 발생할 수 있습니다.은 공유shared"()에 할 수 .so
이며 "디렉터리 합니다. 라이브러리이며 "해당 파일 또는 디렉터리 없음" 오류를 보고합니다.
파일을 test
:
cat <<EOF | g++ -x c++ - -o test
#include <iostream>
int main() {
std::cerr << "Hello!" << std::endl;
return 0;
}
EOF
이것은 실제로 동적 실행 파일입니다. 중입니다.ldd test
다음과 같은 내용을 보고합니다(libc에 대한 종속성 등).
linux-vdso.so.1 (0x00007ffd699fc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff570f7a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff570c76000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff570a5f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff5706c0000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff5714fe000)
이제 이전 실행 파일을 사용하여 처음부터 이미지를 구축해 보겠습니다.도커 파일은 다음과 같습니다.
FROM scratch
COPY test /
CMD [ "/test" ]
이미지를 빌드합니다.그런 다음 이미지에서 즉시 컨테이너를 실행합니다.
docker build . -t local/test
docker run --rm local/test
컨테이너가 종료 코드 1과 함께 실패하고 다음과 같은 메시지가 표시됩니다.
standard_init_linux.go:219: exec user process caused: no such file or directory
를 사용하면 됩니다.-static
in previous 전gcc
/g++
command)는 독립 실행 파일linker 명령을 합니다.
나는 이 문제를 해결하고 vcode로 설정합니다.
- 파일
- 우선권
- 설정
- 텍스트 편집기
- 파일
- Eol - \n으로 설정
- 텍스트 편집기
- 설정
- 우선권
안부 전해요
나는 알파인 컨테이너에서 티니를 사용하고 있었지만 정적으로 연결된 버전을 사용하지 않았고 알파인은 기본적으로 설치된 GNU LibC 라이브러리가 아닌 musllibc를 사용하기 때문에 동일한 오류 메시지와 함께 충돌했습니다.
이를 이해하고 설명서를 제대로 읽는 데 시간이 걸렸다면 Tini Static으로 변경하여 문제를 해결할 수 있었을 것입니다.
여기에는 여러 가지 정답이 있습니다.VIM 버전이 안 보여서 여기 있습니다.VIM에서 파일을 열고 아래쪽 상태 줄(예: 실행)을 확인합니다.set ff=dos
의 경우) (CRLF 경우) 또set ff=unix
(LF의 경우).
메모장++을 사용할 수 없으므로 Mac에서 BBEdit를 사용하여 이 문제를 정렬할 수 있습니다.
그것은 창문 아래쪽에 분명합니다.문자 집합 옵션과 함께
git config core.autocrlf false
git rm --cached -r .
git reset --hard
저는 다음과 같은 것을 제작하면서 비슷한 문제를 겪었습니다.
FROM golang:1.18.0-alpine3.15 AS builder
WORKDIR /go/src/blah
COPY . .
RUN go get -d -v ./...
RUN go install -v ./...
WORKDIR /go/src/blah
FROM centos AS runtime ## NOTICE THE DISTRO CHANGE HERE
COPY --from=builder /go/bin/blah /bin/blah
CMD ["blah"]
여기 제 수정 사항이 있습니다(위에서 설명한 것과 동일하지만 사람들이 확인할 수 있도록 추가).
FROM golang:1.18.0-alpine3.15 AS builder
WORKDIR /go/src/blah
COPY . .
RUN go get -d -v ./...
RUN export CGO_ENABLED=0 && go install -v ./... <== added during install/build
WORKDIR /go/src/blah
FROM centos AS runtime
COPY --from=builder /go/bin/blah /bin/blah
CMD ["blah"]
건배.
때, .exec
명령, 오류 상태입니다.
대부분의 경우, 이것은 당신이 그것을 사용하고 있기 때문입니다.entrypoint.sh
파일에서 추가 명령을 실행할 수 없습니다.
이 오류를 해결하려면 다음을 실행합니다.dos2unix your-entrypoint-file.sh
.
EOL 문자가 업데이트됩니다.
https://nickjanetakis.com/blog/fixing-exec-format-errors-with-docker-entrypoint-scripts-on-windows 도 참조하십시오.
Scratch 컨테이너에서 정적으로 컴파일되지 않은 바이너리를 실행 중이거나 필요한 공유 라이브러리가 없는 경우에도 이 문제가 발생할 수 있습니다.
여기 예: https://github.com/thought-machine/prometheus-cardinality-exporter/issues/26
저는 이 문제에 부딪혔고 그 이유를 알 수 없었습니다.코드를 한 줄씩 다시 쓰는 것을 포함하여 모든 것을 시도하느라 이틀 동안 꼼짝 못했습니다.아무 것도 작동하지 않은 후에 저는 말했습니다. "그냥 웃고 낄낄거리기 위해서, 폴더를 삭제하고 이름을 바꾸겠습니다."저는 이것을 했고, 도커 이미지를 다시 만들고, 컨테이너d로 가져와 K8로 실행하고 비올라가 작동했습니다.그것이 효과가 있다는 것이 말이 되지 않았기 때문에 저는 너무 화가 났어요!잘 모르겠지만 누군가에게 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/51508150/standard-init-linux-go190-exec-user-process-caused-no-such-file-or-directory
'programing' 카테고리의 다른 글
Mocking boto3 S3 클라이언트 메소드 Python (0) | 2023.08.13 |
---|---|
문자열을 줄로 분할하는 가장 좋은 방법 (0) | 2023.08.13 |
git 설명이 실패하고 "failure:이름을 찾을 수 없고, 어떤 것도 설명할 수 없습니다." (0) | 2023.08.13 |
Android의 전체 화면 대화 상자 조각 (0) | 2023.08.13 |
동일한 로그 파일에 추가되는 표준 및 오류 출력의 리디렉션 (0) | 2023.08.13 |