runc · Docker
오류 문구
standard_init_linux.go: exec user process caused: no such file or directory
무슨 뜻인가
컨테이너의 진입점을 실행하려 했지만 커널이 "그런 파일이 없다"고 답했다는 뜻이고, 파일은 분명히 그 자리에 있는데도 이 말이 나오는 것이 함정입니다. 스크립트의 줄 끝이 CRLF라서 첫 줄이 #!/bin/sh\r로 읽히고, 커널은 이름이 sh\r인 실행 파일을 찾다가 실패하는 것입니다 — 윈도우에서 클론했거나 git의 autocrlf가 켜져 있으면 이렇게 됩니다. dos2unix entrypoint.sh로 그 파일만 되돌릴 수 있고(없으면 sed -i 's/\r$//' entrypoint.sh), 다시 나지 않게 하려면 저장소에 .gitattributes를 두고 *.sh text eol=lf를 적으세요. alpine 이미지에 없는 인터프리터를 #!에 적었을 때도 같은 문구가 납니다.
고치는 명령
dos2unix entrypoint.sh- 내는 도구
- runc
- Docker
- 12
docker의 오류는 어느 층에서 났는지를 먼저 갈라야 읽히는데 — 클라이언트가 데몬에 닿지 못한 것, 레지스트리가 거절한 것, 빌드 중에 RUN이 실패한 것, 컨테이너가 뜨자마자 죽은 것이 서로 다른 문제입니다 — 특히 빌드와 실행 단계의 오류는 문구 자체가 이유가 아니라 그 안에서 돌던 명령이 남긴 출력에 이유가 있고, 고치는 명령의 값도 층마다 다릅니다.
오류 문구를 읽는 법
- 첫 줄부터 읽습니다. 아래로 갈수록 도구 내부 이야기이고, 정작 원인은 맨 위에 적혀 있습니다.
- 파일 이름과 줄 번호가 있으면 거기가 시작점입니다 — 스택의 가장 위가 아니라, 내가 쓴 파일이 나오는 가장 위 줄입니다.
- 문구를 그대로 검색합니다. 다만 내 경로와 변수 이름은 지웁니다 — 그 부분이 검색을 방해합니다.
- 같은 문구가 도구 판마다 다르게 나옵니다. 검색 결과가 안 맞으면 판 번호를 함께 넣어 봅니다.
- 고치는 명령을 붙여 넣기 전에 그 명령이 무엇을 버리는지 확인합니다. 되돌릴 수 없는 것이 섞여 있습니다.
자주 묻는 질문
Q. standard_init_linux.go: exec user process caused: no such file or directory 는 무슨 뜻인가요?
컨테이너의 진입점을 실행하려 했지만 커널이 "그런 파일이 없다"고 답했다는 뜻이고, 파일은 분명히 그 자리에 있는데도 이 말이 나오는 것이 함정입니다. 스크립트의 줄 끝이 CRLF라서 첫 줄이 #!/bin/sh\r로 읽히고, 커널은 이름이 sh\r인 실행 파일을 찾다가 실패하는 것입니다 — 윈도우에서 클론했거나 git의 autocrlf가 켜져 있으면 이렇게 됩니다. dos2unix entrypoint.sh로 그 파일만 되돌릴 수 있고(없으면 sed -i 's/\r$//' entrypoint.sh), 다시 나지 않게 하려면 저장소에 .gitattributes를 두고 *.sh text eol=lf를 적으세요. alpine 이미지에 없는 인터프리터를 #!에 적었을 때도 같은 문구가 납니다.
Q. 어떻게 고치나요?
dos2unix entrypoint.sh — 실행 전에 위의 설명에서 이 명령이 무엇을 버리는지 확인하세요.
Q. 어느 도구가 내는 오류인가요?
runc입니다. Docker 갈래에 있고, 문구는 10낱말입니다.