[Docker] Dockerfile에서 쓰이는 명령어

박정태·2024년 8월 8일

Docker

목록 보기
1/3
post-thumbnail

FROM

base 이미지를 지정

Docker Hub에서 이미지 검색이 가능함.

FROM 이미지
FROM 이미지:태그

# Ubuntu 최신 버전을 base 이미지로 지정
FROM ubuntu:lastest

WORKDIR

명령어를 실행할 작업 디렉터리를 지정
(만약 디렉터리가 없다면, 생성하고 작업을 진행)

WORKDIR 명령문은 cd 명령문처럼 컨테이너 상에서 작업 디렉터리로 전환을 위해 사용된다.

WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이우에 등장하는 모든 RUN, CMD, COPY, ENTRYPOINT, ADD 명령문은 해당 디렉터리를 기준으로 실행됨.

WORKDIR 이동할 경로

# /app으로 작업 디렉터리 전환
WORKDIR /app

LABEL

컨테이너 이미지 메타데이터(버전 정보, 작성자, 코멘트)의 상세 정보를 키(key):값(value)형식으로 지정

LABEL title="backend-cicd-test"
LABEL version="1.0"
LABEL maintainer="testuser1<testuser1@test.com>"

RUN

컨테이너 안에서 명령어를 실행

RUN 명령문은 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용된다.

RUN [ "커맨드", "파라미터1", "파라미터2" ]

# openjdk-17 설치
RUN apt-get update 
RUN apt install -y openjdk-17-jdk

ENTRYPOINT

컨테이너 기동 시에 실행할 명령어

ENTRYPOINT 명령문은 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커멘드를 지정할 떄 사용한다.

ENTRYPOINT [ "npm", "start" ]

CMD

컨테이너 기동 시에 실행할 명령어 인수

CMD 명령문은 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드이다.

CMD [ "커맨드", "파라미터1", "파라미터2" ]

# codepipeline-0.0.1-SNAPSHOT.jar를 실행
CMD [ "java", "-jar", "codepipeline-0.0.1-SNAPSHOT.jar" ]

EXPOSE

컨테이너 실행 시 Listen 할 포트를 지정

EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 listening하는 포트와 프로토콜을 지정하기 위해서 사용된다.

프로토콜은 TCP, UDP 중 선택할 수 있으며, 지정하지 않으면 TCP가 기본값으로 사용된다.

주의점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너 내부에서만 유효하며, 호스트 컴퓨터에서는 이 포트를 바로 접근을 할 수가 없다.

호스트 컴퓨터로 해당 포트로의 접근을 허용하려면 docker run 커맨드의 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding) 시켜줘야 한다.

# 5000/TCP 포트로 리스닝
EXPOSE 5000

# ubuntu 최신버전을 5000번 포트로 포워딩
docker run -d -p 5000:5000 ubuntu:latest

COPY

로컬에 있는 파일을 컨테이너로 복사

COPY 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해 사용된다.

WORKDIR app/

# ./build/libs/codepipeline-0.0.1-SNAPSHOT.jar에 있는 jar 파일을
# 컨테이너안에 /app/codepipeline-0.0.1-SNAPSHOT.jar로 옮김
COPY ./build/libs/codepipeline-0.0.1-SNAPSHOT.jar /app/codepipeline-0.0.1-SNAPSHOT.jar

ADD

로컬에 있는 tar.gz 파일을 압축을 풀고 파일을 컨테이너로 복사

ADD 명령어는 COPY 와 유사하게 작동하지만 몇가지 추가 기능을 제공한다.

ADD 명령어는 URL을 통해 파일을 다운로드할 수 있으며, 압축된 파일을 자동으로 추출할 수 있는 기능이 있다.

# backend-cicd-test.tar.xz 파일을 https://www.google.com에서 다운로드하고
# /app에 압축 해제하여 추가함.
ADD https://www.google.com/backend-cicd-test.tar.xz /app

COPY와 ADD 차이점

  • COPY 는 단순하고 명확하지만, ADD 는 URL을 통해 파일을 다운로드하는 등 다양한 기능을 제공한다.
  • COPY로컬 파일에만 사용 가능하지만, ADD 는 원격 URL에서 파일 다운로드가 가능하다.
  • ADD 는 압축된 파일을 이미지 내부에서 자동으로 압축 해제가 가능하지만 COPY 는 불가능하다.

언제 COPY, ADD를 사용해야 될까?

Dockerfile을 작성할 때 명료성과 예측 가능성을 위해 COPY 를 사용하는 것이 권장된다.

ADD 는 특정 상황에서 유용하지만, 추가 기능들이 필요하지 않다면 COPY 를 사용하는 것이 더 간결하고 이해하기 쉽다.

ENV

환경 변수 설정

ENV 명령어는 환경 변수를 설정하기 위해서 사용된다.

ENV 명령어로 설정된 환경 변수는 이미지 빌드 시에도 사용되고, 해당 컨테이너에서 돌아가는 애플리케이션도 접근 가능하다.

# 자바 경로를 지정
ENV JAVA_HOME=/usr/lib/jvm/default-jvm

ARG

빌드 시 넘어오는 인자 값 설정

ARG 명령어는 docker build 커맨드로 이미지 빌드 시, —build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용

# port 인자 선언
ARG port

# port 값 넘기는게 가능해짐
$ docker build --build-arg port=8080 .

USER

명령어 실행 계정 지정

USER 명령어는 이미지 실행이나 컨테이너파일의 RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 사용자 지정이 가능하다.

USER 명령에서 지정하는 사용자는 RUN 명령으로 미리 만들어 두어야 가능하다.

# testuser1이라는 user 추가
RUN [ "adduser", "testuser1" ]

# testuser1으로 로그인
USER testuser1
profile
정보 공유

0개의 댓글