이미지 빌드 · Dockerfile 문법 · 퀴즈
퀴즈: Dockerfile 문법
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
`ARG TOKEN` 으로 받은 값을 RUN 에서 쓰고 같은 RUN 에서 파일을 지웠습니다. 안전합니까?
- 안전하다 — 같은 레이어에서 지웠으므로
- 안전하다 — ARG 는 이미지에 저장되지 않는다
- 안전하지 않다 — 빌드 히스토리와 하위 레이어에 흔적이 남을 수 있다
- 빌더 종류와 무관하게 안전하다
`USER app` 대신 `USER 10001:10001` 을 권하는 실질적인 이유는?
- 숫자로 쓰면 조회가 더 빠르다
- 이름을 쓰면 /etc/passwd 가 필요해 이미지가 커진다
- USER 에는 숫자만 지원되기 때문
- 쿠버네티스 runAsNonRoot 가 이름으로는 root 여부를 판별하지 못해 파드를 거부한다
`COPY . /app` 다음 줄에 `RUN chown -R app:app /app` 을 두면?
- 아무 영향 없다
- 권한만 바뀌고 크기는 그대로다
- 캐시가 좋아진다
- 파일 전체가 새 레이어에 다시 쓰여 이미지가 거의 두 배가 된다
이미지에 `HEALTHCHECK` 를 넣었는데 쿠버네티스에서 아무 효과가 없습니다. 왜입니까?
- HEALTHCHECK 문법을 잘못 썼기 때문
- 쿠버네티스는 이미지의 HEALTHCHECK 를 무시하고 liveness/readiness 프로브를 따로 봅니다
- 프로브가 보는 포트가 서로 다르기 때문
- HEALTHCHECK 는 빌드할 때만 동작하고 실행 중에는 꺼지기 때문
`ADD release.tar.gz /opt/app/` 이 위험할 수 있는 이유는?
- COPY보다 항상 전송 속도가 느려서
- 추출한 모든 파일 권한이 초기화되어서
- 자동으로 압축을 풀기 때문에 아카이브 안의 경로에 따라 의도치 않은 위치에 파일이 쓰일 수 있다
- ADD 명령 하나가 반드시 레이어를 두 개 만들어 버려서
`EXPOSE 8080` 이 실제로 하는 일은?
- 호스트의 8080 포트를 연다
- 컨테이너의 방화벽을 설정한다
- 문서화 — 이 이미지가 어떤 포트를 쓰는지 알린다
- 포트 매핑을 자동 생성한다