Files
dockerfile/README.md
2023-02-28 05:27:04 +00:00

4.6 KiB

Dockerfile 작성 방법

해당 문서는 엑셈 면접 진행중 받은 질뭉문 ADD/COPY의 차이가 순간적으로 기억이 나지 않아 다시 한번 정리를 위해 작성되었습니다. Dockerfile 작성 밥법뿐 아니라 추가적으로 Docker에 관련된 내용도 작성 예정 CRI-O, Podman을 주로 사용하다 보니 Docker에 대해서 기억이 안나는 부분이 있기 때문에 가장 기본이 되는 내용 위주로 작성 예정

Dockerfile

  • FROM : 베이스 이미지
  • MAINTAINER : 이미지 빌더를 의미 (1.13.0 이후로 사용되지 않는다고 함)
    MAINTAINER Junghun <sa_8001@jhcloud.kr>
    
  • LABEL : 이미지에 메타데이터 추가 (key-value)
    • 이미지의 버전 정보, 작성자, 코멘트 등 이미지의 상세 정보를 입력하기 위해 사용
    • docker image inspect --format="{{ .Config.Labels }}" [이미지명] 커맽드를 통해 확인 가능
    LABEL version="1.0"
    LABEL Description="Sample Docker Image"
    
  • RUN : 새로운 레이어에서 명령어를 실행 및 이미지 생성
    • RUN을 실행할 때 마다 새로운 레이어가 생성되고 캐시됨
    • 즉 dnf update를 RUN으로 실행후 새로운 RUN으로 패키지를 설치할 경우 update가 되어 있지 않기 때문에 최신 버전의 패키지를 받을 수 없음
    RUN \
        dnf update -y && \
        dnf install -y nfs-utils
    
    • 계속해서 레이어가 생성되고 캐시 되기 때문에 효율적으로 작성하기 위한 방법을 질문 받아 생각해 보았음
      • 하나의 RUN으로 여러 명령을 수행하거나 shell script를 작성하여 COPY후 하나의 RUN으로 실행하는 방법으로 진행
  • WORKDIR : 작업 디렉토리 지정 (만약 디렉토리가 없을 경우 새로 생성을 함)
    • cd 커맨드와 동일하다고 생각하면 됨, 디렉토리 지정시 다음 명령어부터는 해당 디렉토리에서 진행
    WORKDIR $DIRPATH/$DIRNAME
    
  • EXPOSE : 빌드를 통해 생성된 이미지에서 사용할 포트
    EXPOSE 9090
    
  • USER : 사용할 계정을 선택한다 (default : root)
    • USER 자체는 계정 생성을 해주지 않기 때문에 사전에 미리 "RUN" 을 사용하여 계정 추가가 필요하다
    centos 기준 그룹, 유저 생성
    groupadd groupname
    useradd -g groupname(옵션) usrid
    
    -m : 해당 유저의 폴더를 같이 생성
    -g : 그룹 지정
    -d : 디렉토리 지정
    -s : 쉘(shell) 지정
    -p : 패스워드(암호) 지정
    
    • USER를 지정하면 다음 명령부터는 지정한 유저로 실행
    USER usrid
    
  • COPY / ADD : local의 파일 또는 디렉토리를 이미지내로 옮김
    • ADD 명령어는 COPY의 상위 명령어 정도로 이해
    • COPY는 단순히 local의 파일 혹은 디렉토리를 옮기는 용도
    • ADD 같은 경우 압축 파일 혹은 네트워크를 통한 파일도 사용할 수 있음
    • 일반적으로는 COPY 사용 권당
    COPY test.sh /root/copy/test.sh
    ADD https://git.jhcloud.kr/test/test.php /root/web/index.php
    
  • ENV / ARG : 환경 변수
    • ENV : Dockerfile 또는 컨테이너 안에서 사용하는 환경 변수
    • ARG : Dockerfile 에서만 사용하는 환경 변수
    # ENV [key] [value]
    ENV version 1.0
    ENV name jhcloud.kr
    
    # ENV [key]=[value]  ## 한번에 여러개의 값을 설정할 때 사용 
    ENV version=1.0 \
        name=jhcloud.kr
    
    # [key]=[value]
    ARG version=1.0
    ARG name=jhcloud.kr
    
  • CMD / ENTRYPOINT : 컨테이너가 생성 및 실행될 경우 실행할 명령어
    • CMD : 컨테이너가 생성 시 실행 / 컨테이너 생성 시 추가적인 커맨드를 입력할 경우 무시되고 입력한 커맨드를 실행
    • ENTRYPOINT : 컨테이너가 실행 될 때마다 실행 / 컨테이너 생성 시 추가적인 커맨드를 입력하여도 실행(입력한 커맨드는 인자 값으로 사용됨)
    CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
    CMD <커맨드> <파라미터1> <파라미터2>
    
    ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
    ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
    
  • ONBUILD : 해당 명령어가 사용된 이미지를 FROM image로 사용하여 빌드할 경우 동작
    • 일반적으로 잘 사용은 되지 않음
    • ONBUILD ADD web.tar /var/www/html 와 같이 정의한 다음 개발자들이 web.tar를 만들어 빌드 후 실행시키는 등의 방식으로 사용한다함
    ONBUILD ADD web.tar /var/www/html