본문 바로가기

Dockerfile 검사기

브라우저 처리

Dockerfile을 줄 단위로 읽어 태그 없는 FROM, root 실행, apt-get 캐시·-y 누락, 셸 형식 CMD, 잘못된 EXPOSE 포트, 이미지에 남는 비밀값 등을 행 번호와 함께 오류·경고·참고로 알려 줍니다.

사용 전 확인
  • 파일·이미지·문서 처리 도구는 브라우저 안에서 처리되더라도 원본에 개인정보나 민감 정보가 포함될 수 있습니다. 공유·제출 전 원본과 결과를 한 번 더 확인하세요.
도구 실행입력 후 결과 확인
Dockerfile 검사기 샘플 실행

Dockerfile은 빌드가 성공해도 이미지가 필요 이상 크거나, root로 실행되거나, 비밀번호가 이미지 기록에 남는 문제를 숨기고 있을 수 있습니다. 이 검사기는 \로 이어진 여러 줄 명령까지 하나로 합쳐 읽고, 자주 생기는 실수를 원래 행 번호와 함께 알려 줍니다.

브라우저 처리
샘플 결과
오류 0 · 경고 1 · 참고 4
명령 5개를 검사했습니다.

[경고] 마지막 단계가 root로 실행됩니다. root가 아닌 계정으로 USER를 지정하세요.
[참고] HEALTHCHECK가 없어 컨테이너 안 앱의 정상 여부를 알 수 없습니다.
2행 [참고] 같은 RUN에서 /var/lib/apt/lists/*를 지워 이미지 크기를 줄이세요.
2행 [참고] --no-install-recommends로 불필요한 패키지 설치를 줄일 수 있습니다.
5행 [참고] CMD를 셸 형식으로 쓰면 /bin/sh를 거쳐 종료 신호가 앱에 전달되지 않습니다. ["실행", "인수"] 형식을 권장합니다.
자바스크립트가 활성화되면 이 영역이 실제 입력, 실행, 결과 패널로 바뀝니다.

Dockerfile 검사기 사용 가이드

Dockerfile은 빌드가 성공해도 이미지가 필요 이상 크거나, root로 실행되거나, 비밀번호가 이미지 기록에 남는 문제를 숨기고 있을 수 있습니다. 이 검사기는 \로 이어진 여러 줄 명령까지 하나로 합쳐 읽고, 자주 생기는 실수를 원래 행 번호와 함께 알려 줍니다.

FROM 이미지에 태그가 없거나 latest인지, 첫 명령이 FROM인지, 마지막 단계가 root 사용자로 끝나는지, apt-get install에 -y와 update가 같은 RUN에 있는지, 패키지 목록 캐시를 지우는지 확인합니다. sudo, RUN cd, curl | sh, chmod 777, ADD로 로컬 파일 복사하기 같은 습관도 짚어 줍니다.

CMD·ENTRYPOINT의 JSON 배열이 작은따옴표로 깨졌는지, EXPOSE 포트가 범위 안인지, ENV·ARG 이름에 PASSWORD나 TOKEN이 들어 있는지도 봅니다. 결과는 오류, 경고, 참고 순으로 정렬되며 FROM ... AS build 같은 다단계 빌드에서는 이전 단계 이름을 이미지로 착각하지 않습니다.

사용 방법

  1. 'Dockerfile 내용' 칸에 Dockerfile 전체를 붙여 넣습니다.
  2. '실행'을 누르면 맨 위에 오류·경고·참고 개수가 나오고, 아래에 행 번호별 지적 사항이 정렬되어 나옵니다.
  3. 오류부터 고치고, 경고와 참고는 이미지 용도에 맞게 반영합니다.

예시: Python 앱 Dockerfile

입력
FROM python:3.12
RUN apt-get update && apt-get install -y gcc
COPY . /app
WORKDIR /app
CMD python app.py
결과
오류 0 · 경고 1 · 참고 4
명령 5개를 검사했습니다.

[경고] 마지막 단계가 root로 실행됩니다. root가 아닌 계정으로 USER를 지정하세요.
[참고] HEALTHCHECK가 없어 컨테이너 안 앱의 정상 여부를 알 수 없습니다.
2행 [참고] 같은 RUN에서 /var/lib/apt/lists/*를 지워 이미지 크기를 줄이세요.
2행 [참고] --no-install-recommends로 불필요한 패키지 설치를 줄일 수 있습니다.
5행 [참고] CMD를 셸 형식으로 쓰면 /bin/sh를 거쳐 종료 신호가 앱에 전달되지 않습니다. ["실행", "인수"] 형식을 권장합니다.

행 번호가 없는 항목은 파일 전체에 대한 지적입니다.

이럴 때 쓰면 좋아요

  • 새로 만든 Dockerfile을 커밋하기 전에 기본 실수를 점검할 때
  • 이미지 용량이 커서 apt 캐시나 불필요한 패키지를 찾을 때
  • 보안 점검에서 root 실행이나 비밀값 노출을 지적받았을 때
  • docker stop에 앱이 바로 종료되지 않는 원인을 찾을 때

문제가 생겼을 때

'CMD의 exec 형식은 큰따옴표를 쓴 JSON 배열이어야 합니다' 오류

CMD ['node', 'app.js']처럼 작은따옴표를 쓰면 JSON이 아니라서 셸 문자열로 실행됩니다. CMD ["node", "app.js"]로 바꾸세요.

'마지막 단계가 root로 실행됩니다' 경고

RUN useradd -m app 같은 명령으로 계정을 만들고 마지막 단계에 USER app을 넣으세요. node 이미지는 node, nginx 이미지는 nginx 계정이 이미 있습니다.

활용 팁

  • apt-get update와 install을 && 로 한 RUN에 묶고 끝에 rm -rf /var/lib/apt/lists/*를 붙이는 것이 표준 패턴입니다.
  • 빌드에만 필요한 도구(gcc 등)는 다단계 빌드의 앞 단계에서만 설치하고 마지막 단계에는 결과물만 COPY --from으로 가져오세요.

자주 묻는 질문

hadolint와 같은 규칙인가요?

hadolint의 대표 규칙(태그 고정, apt-get, sudo, WORKDIR, exec 형식 등)을 중심으로 구현했지만 전체 규칙을 다 포함하지는 않습니다. CI에서는 hadolint를 함께 쓰는 것을 권장합니다.

ARG로 정한 변수가 들어간 이미지 이름도 검사하나요?

${NODE}처럼 변수가 들어간 이미지는 실제 값을 알 수 없어 태그 검사를 건너뜁니다.

HEALTHCHECK는 꼭 넣어야 하나요?

필수는 아니라 '참고'로만 표시합니다. Kubernetes를 쓴다면 HEALTHCHECK 대신 Pod의 livenessProbe·readinessProbe로 상태를 확인합니다.