본문 바로가기

Back-End/Docker

DOCKER RUN과 WORKDIR

[RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행]

RUN은 이미지 생성 과정에서 명령어를 실행시켜야할 때 사용한다.

# 문법
RUN [명령문]

# 예시
RUN npm instal

[RUN vs ENTRYPOINT]
얼핏 보면 두 개의 명령어는 비슷한 역할을 하는 것 같아서 헷갈리 때가 있다. 하지만 엄연히 둘의 사용 용도는 다르다.

  • RUN 은 이미지 생성 과정에서 필요한 명령어를 실행 시킬 때 사용하고
  • ENTRYPOINT 는 생성된 이미지 기반으로 컨테이너를 생성한 직후에 명령어를 실행시킬 때 사용한다.

[예제]
미니 컴퓨터 환경이 jdk로 구성되었으면 좋겠고 git이 깔려있으면 좋겠다고 가정하자.

1. Dockerfile 작성하기

# 1. JDK 17 이미지를 베이스로 사용
FROM openjdk:17-jdk

# 2. apt 패키지 목록 업데이트 후, git 설치
RUN apt-get update && apt-get install -y git

# 3. 작업 디렉토리 설정 (선택 사항)
WORKDIR /app

# 4. JAR 파일을 컨테이너 내부로 복사
COPY ./app.jar /app/app.jar

# 5. ENTRYPOINT 설정 (Spring Boot 애플리케이션 실행)
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

2. 이미지 빌드 및 컨테이너 실행

$ docker build -t my-spring-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ git -v # 컨테이너 내에 git이 잘 설치됐는 지 확인

[WORKDIR : 작업 디렉토리를 지정]

WORKDIR으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다. 작업 디렉터리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다. 컨테이너도 미니 컴퓨터와 같기 때문에 Dockerfile을 통해 생성되는 파일들을 특정 폴더에 정리해두는 것이 추후에 관리가 쉽다. 만약 WORKDIR을 쓰지 않으면 컨테이너 내부에 존재하는 기존 파일들과 뒤섞여버린다.

# 문법
WORKDIR [작업 디렉토리로 사용할 절대 경로]

# 예시
WORKDIR /usr/src/app

[예제]

1. app.txt, src, config.json 파일 만들기

2. Dockerfile 만들어서 이미지 생성 및 컨테이너 실행

FROM ubuntu

WORKDIR /my-dir

COPY ./ ./

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls