안녕하세요. 이 글에서는 쉘스크립트 에러 핸들링과 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
'전공영역 공부 기록' 카테고리의 다른 글
istio keycloak 인증 연동 - 작성중단 (2) | 2022.03.30 |
---|---|
tmux 세션 종료 (0) | 2022.03.27 |
Istio 트래픽 흐름과 설정 이해 (0) | 2022.03.27 |
Istio envoy를 동적으로 설정하는 원리 (0) | 2022.03.26 |
envoy proxy 체험 (0) | 2022.03.26 |