전공영역 공부 기록

리눅스 쉘 스크립트 에러 핸들링과 dockerfile 적용

악분 2022. 3. 27. 18:34
반응형

안녕하세요. 이 글에서는 쉘스크립트 에러 핸들링과 Dockerfile적용한 예제를 설명합니다.

 

1. 에러 핸들링이란?

애러 핸들링은 말 그대로 에러가 발생하면 어떻게 처리할 것인가입니다. 개발에서 에러 핸들링이 매우 기본기이면서 중요한데요. 리눅스 쉘 스크립도 에러 핸들링이 매우 중요합니다.

 

에러 핸들링을 하지 않으면 예기치 못한 장애가 발생할 수 있으므로 최소한 예외처리가 필요합니다.

 

2. 에러가 발생하면 중지

2.1 문제

쉘스크립트 github링크: https://github.com/choisungwook/shellscript-errorhandling/blob/main/first/problem.sh

쉘스크립트는 에러가 발생해도 멈추지 않습니다.

#!/bin/sh
# 존재하지 않는 명령어
thisisnotcommand
echo "done"

 

아래 결과처럼 에러가 발생했지만 echo "done"이 실행되었습니다.

 

dockerfile에서도 똑같이 적용됩니다.

dockerfile github링크: https://github.com/choisungwook/shellscript-errorhandling/blob/main/first/Dockerfile
FROM busybox:1.35.0

WORKDIR /
COPY problem.sh problem.sh
RUN chmod +x ./problem.sh && /problem.sh

 

docker build로 이미지를 생성하면 어떠한 오류도 발생하지 않습니다. 

docker build -t example:v1 .

 

2.2 해결

set -e를 사용하면 쉘 스크립트 오류가 발생하면 중지합니다.

#!/bin/sh
set -e

# 존재하지 않는 명령어
thisisnotcommand
echo "done"

 

 

Dockerfile에서도 오류가 발생하여 빌드가 중지됩니다.

 

2.3 nginx 공식dockerfile

많은 유명한 오픈소스 dockerfile에는 쉘스크립트 에러 핸들링을 하고 있습니다. 대표적으로 nginx를 살펴보죠.

 

nginx github dockerfile링크(https://github.com/nginxinc/docker-nginx/blob/6f0396c1e06837672698bc97865ffcea9dc841d5/mainline/debian/docker-entrypoint.sh#L4)를 살펴보면 set -e가 설정되어 있습니다.

 

3. 기타 에러 핸들링

이외에도 환경변수 에러 핸들링(set -u), 파이프라인(set -o) 등 에러 핸들링 옵션이 있습니다. 상황에 맞게 적절히 에러 핸들링을 사용하시면 됩니다.

 

4. 참고자료

https://pythonspeed.com/articles/shell-scripts/?fbclid=IwAR2J38wo9qFS259f2ZaNKyXIOJxJ5VUaP9NLyampVHjYcCn6sO-NbyUCJ7E

반응형