Linux의 exec 형식 오류”

컨테이너 실행 중 “exec 사용자 프로세스 발생: exec 형식 오류” 해결하기

대규모 프로젝트를 완료한 후, 팀과 함께 환경적 문제와 개발 환경에서만 작동하는 상황을 피하고자 스테이징 및 프로덕션 단계에서 컨테이너화를 적용하기로 결정했습니다. 하지만 컨테이너 생성 과정에서 “exec 사용자 프로세스 발생: exec 형식 오류”라는 메시지를 만나게 되었고, 해결 방법을 찾기 어려울 수 있습니다. 걱정하지 마세요. 이 가이드에서는 Linux 시스템에서 이 오류의 원인을 자세히 살펴보고, 문제 해결을 위한 몇 가지 확실한 해결책을 제시합니다.

“exec 사용자 프로세스 발생: exec 형식 오류” 문제 해결 (2023년)

“exec 사용자 프로세스 발생: exec 형식 오류”의 주요 원인

가장 흔한 원인 중 하나는 #!/bin/bash와 같은 스크립트 헤더 누락입니다. 이로 인해 컨테이너를 실행하려고 할 때 CrashLoopBackOff 상태로 컨테이너가 대기 상태에 머무르게 됩니다. 컨테이너 로그를 확인하면 오류 메시지가 standard_init_linux.go:300에서 “exec 사용자 프로세스로 인해 ‘exec 형식 오류’가 발생했습니다.”와 같이 나타나는 것을 확인할 수 있습니다.

위에 언급된 원인 외에도, 컨테이너 작업 중 이 오류를 유발하는 다른 요인들도 존재합니다:

  • 스크립트 헤더에 불필요한 공백 추가 등 잘못된 형식의 헤더 사용
  • 스크립트 작성 시 호환되지 않는 문자 인코딩 사용
  • CPU 아키텍처 불일치
  • 필요한 파일 권한 누락

이것이 이 오류의 모든 가능한 원인은 아니지만, 가장 일반적인 원인들을 나열한 것입니다. 이제 Linux 환경에서 이러한 문제를 해결하기 위한 5가지 주요 해결 방법을 살펴보겠습니다.

“exec 사용자 프로세스 발생: exec 형식 오류” 수정 방법

스크립트 언어로 작성된 코드를 실행할 때는 항상 스크립트 헤더를 사용하는 것이 좋습니다. 이는 쉘에게 어떤 인터프리터를 사용할지 알려줍니다. 스크립트 헤더는 스크립트의 진입점 역할을 한다고 생각할 수 있습니다. 스크립트 헤더 사용 시 다음 사항을 유의해야 합니다:

  • 스크립트 헤더는 #! 문자로 시작해야 합니다.
  • 헤더에는 공백이나 다른 특수 문자가 포함되어서는 안 됩니다.
  • 사용하는 프로그래밍 언어와 배포판에 맞는 헤더를 사용해야 합니다. 예를 들어 Debian 기반 배포판에서 Python 3.x를 사용한다면 다음 헤더를 사용할 수 있습니다:

#!/usr/bin/python3

Alpine Linux를 사용할 때, 많은 사용자가 다른 Linux 배포판에서 사용되는 bash 스크립트 헤더와 동일한 것을 사용하려 합니다. 하지만 Alpine Linux에서는 다음과 같은 스크립트 헤더를 사용하는 것이 더 적합합니다:

#!/bin/sh

2. 줄 바꿈 문자 인코딩 문제

줄 바꿈 문자는 사소해 보일 수 있지만, 때로는 오류의 주요 원인이 될 수 있습니다. 개행 문자(End Of Line, EOL)는 줄 바꿈을 나타내며, Windows와 Linux에서 다르게 처리됩니다. Windows는 캐리지 리턴 라인 피드(CRLF)를 사용하여 줄 바꿈을 \r\n으로 해석하는 반면, Linux는 라인 피드(LF)를 사용하여 줄 바꿈을 \n으로 해석합니다.

만약 Windows에서 CRLF 인코딩으로 작성된 파일을 Linux 환경으로 전송하게 되면, “exec 형식 오류”가 발생할 수 있습니다. 이 문제는 간단한 방법으로 해결할 수 있습니다.

  • Linux 텍스트 편집기로 해당 파일을 엽니다.
  • 찾기 및 바꾸기 기능을 사용하여 \r\n을 검색하고 모든 인스턴스를 \n으로 바꿉니다.
  • 또는, 실제 코드 작성 시 Linux 인코딩으로 설정할 수도 있습니다.

3. 아키텍처 불일치

시스템 아키텍처 불일치는 “exec 사용자 프로세스 발생: exec 형식 오류”의 또 다른 주요 원인입니다. 컨테이너 기술은 하드웨어가 아닌 소프트웨어 환경 관련 문제를 해결하기 위해 개발되었지만, 서로 다른 아키텍처에서 실행될 때 문제가 발생할 수 있습니다.

예를 들어, Apple M 시리즈 칩셋과 같은 ARM 아키텍처 시스템에서 개발된 코드를 x86 시스템을 사용하는 프로덕션 환경에 배포하려고 할 때 이 오류가 발생할 수 있습니다. 이는 ARM과 x86에서 저수준 명령어 변환 방식이 다르기 때문입니다. Docker는 Apple M1 Pro 플랫폼을 linux/arm64/v8로 인식합니다. 이 문제를 해결하려면 이미지 빌드 시 다음 Docker 구문을 사용하십시오:

docker buildx build –platform=linux/amd64 -t <이미지_이름>:<버전>-amd64 .

그런 다음, Dockerfile의 “FROM” 문을 다음 구문으로 업데이트하십시오:

FROM –platform=linux/amd64 <베이스_이미지>:<버전>

위의 명령을 사용하면 이미지가 arm64에서 amd64 아키텍처로 수정되어 문제를 해결할 수 있습니다. 이 솔루션이 Docker 배포 문제를 해결하는 데 도움이 되는지 확인하십시오.

4. 잘못된 스크립트 인코딩

잘못된 스크립트 인코딩은 일반적인 문제는 아니지만, 특히 Windows 환경에서 “exec 사용자 프로세스 발생: exec 형식 오류”를 유발할 수 있습니다. 스크립트 작성 시 인코딩이 UTF-8로 설정되어 있는지 확인하는 것이 중요합니다. VS Code를 사용하는 경우 다음 단계를 따라 인코딩을 변경할 수 있습니다:

1. 인코딩을 변경하려는 파일을 VS Code에서 엽니다.

2. 왼쪽 상단 “파일” 메뉴에서 “기본 설정”으로 이동한 다음 하위 메뉴에서 “설정”을 선택합니다. 또는 키보드에서 “Ctrl + ,”를 눌러 설정 메뉴에 직접 접근할 수 있습니다.

3. 검색 창에 “인코딩”을 입력하고 Enter 키를 누릅니다. “파일: 인코딩” 설정에서 드롭다운 메뉴를 볼 수 있습니다.

4. 드롭다운 메뉴에서 “UTF-8″을 선택합니다. 그러면 VS Code에서 열거나 수정하는 모든 파일의 인코딩 형식이 변경됩니다.

일반적으로 UTF-8 인코딩은 대부분의 사용자에게 적합합니다. 만약 여전히 오류가 발생한다면, 위와 동일한 단계를 사용하여 인코딩을 “UTF8+BOM”으로 변경해볼 수 있습니다. BOM은 Byte Order Mark의 약자입니다.

만약 vim이나 다른 명령줄 기반 텍스트 편집기를 사용한다면, 시스템 전체의 인코딩 형식을 사용해야 합니다. Linux에서 UTF-8 지원을 활성화하는 방법에 대한 자료를 참고하십시오.

5. 잘못된 파일 권한

파일 권한은 프로젝트 진행 중 종종 간과되기 쉽습니다. 권한은 읽기, 쓰기, 실행의 세 가지 유형으로 나뉘며, 실행 권한은 소유자, 사용자, 그룹의 세 가지 사용자 범주에 따라 달라집니다. 일반적으로 실행 권한 없이 실행 파일을 실행하면 “권한 거부” 오류가 발생합니다. 하지만 컨테이너화된 프로젝트에서는 실행 권한이 없는 단일 파일로 인해 “exec 사용자 프로세스 발생: exec 형식 오류”가 발생할 수도 있습니다. 컨테이너 내 모든 파일의 권한을 확인하려면 다음 단계를 따르십시오.

1. 다음 명령을 사용하여 컨테이너 디렉토리로 이동합니다.

cd <컨테이너_경로>

2. 해당 디렉토리 내 모든 파일의 권한을 확인하려면 다음 명령을 사용하십시오.

ls -la

3. 파일에 실행 권한을 추가하려면 다음 구문을 사용하십시오.

chmod +x <파일명1> <파일명2> <파일명3>

“exec 사용자 프로세스 발생: exec 형식 오류” 해결하기

더 큰 문제를 작은 조각으로 나누면 더욱 효율적으로 문제를 해결할 수 있습니다. 이 글에서는 “exec 사용자 프로세스 발생: exec 형식 오류”의 원인과 해결 방법을 알아보았습니다. 위에 제시된 해결 방법이 오류를 해결하는 데 도움이 되었으면 합니다. 파일 권한에 대한 자세한 내용은 Linux 파일 권한에 대한 자료를 참고하시기 바랍니다. 만약 오류 해결에 어려움을 겪고 있다면, 아래 댓글 섹션에 문의하십시오.