Dockerfile tips and tricks

From HPCWIKI
Revision as of 14:49, 16 July 2026 by Clara (talk | contribs) (Phase 6.1: LLM-Optimized Wiki Template migration)
Jump to navigation Jump to search

Dockerfile tips and tricks

Template:Status

Template:TOC

Overview

Docker 이미지 빌드 및 컨테이너 운영 시 유용한 팁과 트릭 모음. 버전 충돌 해결, GPU 설정, 성능 튜닝, 시그널 처리 등 실용적인 문제 해결 가이드.

Summary

  • 무엇인가? Dockerfile 작성 및 Docker 컨테이너 운영 시 발생하는常见问题 해결 방법
  • 왜 필요한가? Docker 환경 설정 오류, 버전 충돌, GPU 연산 문제 등을 빠르게 해결
  • 언제 사용하는가? Docker 이미지 빌드, 컨테이너 실행, GPU/OpenCL 설정, 리소스 튜닝 시

---

Purpose

Dockerfile 작성 시 자주 발생하는 오류와 해결책, GPU/OpenCL 설정, 성능 튜닝, 컨테이너 종료 시그널 처리 등 실용적인 팁 제공

  • Goal: Docker 환경 구축 및 운영 시 시간 절약 및 문제 해결 속도 향상
  • Scope: Dockerfile 빌드 팁, GPU/OpenCL 설정, 리소스 튜닝, 시그널 처리
  • Non-goals: Docker 기본 사용법 튜토리얼, Docker Compose 상세 설정

---

Key Concepts

Topic Description Related
Version Conflict Docker 패키지 간 의존성 충돌 해결 Docker command workflow
OpenCL in Docker 컨테이너 내 GPU/OpenCL 설정 GPU Support
Resource Tuning Docker 리소스 및 성능 최적화 Docker container resource
Container Stop Signal 컨테이너 종료 시 SIGTERM/SIGKILL 처리 Docker command workflow

---

Architecture

Docker 컨테이너는 호스트 OS의 커널을 공유하는 경량 가상화 환경. GPU/OpenCL 연산을 컨테이너 내에서 사용하려면 호스트의 NVIDIA 드라이버와 OpenCL 라이브러리를 컨테이너에 노출해야 함.

---

Workflow

  1. Dockerfile 기반 이미지 빌드
  2. 의존성 버전 충돌 시 pip install -U 로 해결
  3. GPU/OpenCL 설정 시 nvidia-container-toolkit 및 ICD 파일 구성
  4. 컨테이너 종료 시 SIGTERM → 10초 후 SIGKILL 기본 동작 확인
  5. ENTRYPOINT/STOPSIGNAL/docker-compose.yml stop_signal 설정으로 동작 커스터마이징

---

Configuration

OpenCL 설정 (Docker 내 GPU)

FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y upgrade \
  && apt-get install -y \
    ocl-icd-libopencl1 \
    opencl-headers \
    clinfo \
    ;

RUN mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

Root 비밀번호 설정

# 이미지 빌드 시
RUN echo 'root:Docker!' | chpasswd

# 또는
RUN echo 'Docker!' | passwd --stdin root

# 실행 중인 컨테이너에서
docker exec -itu 0 {container} passwd

# 3rd party 이미지에서 root로 로그인
docker container exec -u 0 -it mycontainer bash

Docker requests 버전 충돌 해결

pip install -U urllib3 requests==<right_version>

NAT chain 오류 해결

sudo apt update && sudo apt upgrade && sudo systemctl restart docker.service

---

Examples

컨테이너 종료 시그널 처리

기본 동작:

  • `docker stop` → ENTRYPOINT 프로세스에 SIGTERM 전송
  • 10초 후 → SIGKILL 전송

커스터마이징:

  • Dockerfile의 `STOPSIGNAL` 지시자 변경
  • docker-compose.yml의 `stop_signal` 설정
  • docker-compose.yml의 `stop_grace_period` 설정

예시 (php-fpm/nginx): SIGQUIT 사용 (SIGTERM 대신)

---

Best Practices

  • 의존성 충돌 시 `pip install -U`로 최신 버전으로 업그레이드
  • GPU/OpenCL 사용 시 `NVIDIA_VISIBLE_DEVICES`와 `NVIDIA_DRIVER_CAPABILITIES` 환경변수 필수 설정
  • 컨테이너 종료 시 graceful shutdown을 위해 ENTRYPOINT에서 시그널 핸들러 구현
  • Dockerfile에서 `ARG DEBIAN_FRONTEND=noninteractive`로 대시로그 상호작용 방지

---

Performance

Setting Impact Notes
OpenCL ICD 설정 GPU/OpenCL 연산 가능 /etc/OpenCL/vendors/nvidia.icd 필수
NVIDIA_DRIVER_CAPABILITIES 컨테이너 내 GPU 접근 compute,utility 권장
stop_signal 설정 graceful shutdown php-fpm/nginx는 SIGQUIT 권장

---

Limitations

  • Docker 7.0.0+는 requests>=2.26.0 필수
  • NAT chain 오류 시 재부팅 대신 docker.service 재시작 필요
  • 3rd party 이미지는 USER 설정이 override 될 수 있음 (-u 0 사용)

---

References

---

Related Pages

---