본문 바로가기
  • Code Smell
DevOps

[Docker] Dockerfile 정리

by HSooo 2020. 6. 21.

Dockerfile

Dockerfile은 Docker Image를 만들기 위한 스크립트 파일이다. Dockerfile 내에 Docker Image를 만들면서 해야하는 작업을 전부 명령어화 시켜 Docker Image를 만들기 위한 과정을 작성 할 수 있다.

예를들면

특정 Spring Boot 웹서비스를 띄우기 위한 Docker Image가 필요한데 순정 배포판 Docker Image를 받아다가

  • JDK도 설치
  • tomcat설치
    (사실 여기까지 설치 되어있는 건 DockerHub에서 찾을수 있다.)
    그리고 DockerImage 내에 Spring Boot App도 배포해야 할것이다. 이런 과정을 Dockerfile 내에 스크립트로 작성해놓으면, Docker가 Dockerfile을 읽어 JDK+tomcat+SpringBoot App까지 배포가 완료된 Docker Image를 만든다.

도커파일 파일명

기본적으로 Dockerfile의 파일명은 Dockerfile 이다. (확장자없음)
도커파일 빌드 시 옵션으로 이름을 변경할 수 있으나, 옵션을 주지 않으면 Dockerfile이다.

FROM

Base 이미지를 지정한다. 로컬에 없는경우 DockerHub를 가서 찾아온다.
FROM 이미지명:버전명

FROM amazonlinux:latest

RUN

명령어를 실행할때 쓴다. 1번의 RUN 명령어는 1개의 이미지를 생성한다.
단계별로 이미지가 생성된다고 보면 된다.
여러개의 명령어를 묶어 실행하고 1개의 이미지로 만들때는 && 연산자를 사용한다.

curl 패키지 설치후 이미지 생성, 이후 이어서 루트 밑에 folder를 만든 이미지를 생성한다고 하면

RUN apt-get update && apt-get install -y curl
RUN mkdir /folder

COPY

호스트에서 도커이미지 안으로 파일을 복사할 때 쓴다. 호스트 파일은 시작위치가 Dockerfile과 동일한 경로에서 시작한다.
COPY 호스트파일 도커이미지 내 파일경로

COPY app.jar /folder/app.jar

ADD

COPY와 기능은 유사하지만 원격 다운로드 및 압축 기능 등의 추가 기능이 포함됨.

CMD

docker run/start로 컨테이너가 뜰 때 실행할 명령어. 다만 run 시 추가 argument를 부여하면 CMD 명령어는 실행되지 않는다.

컨테이너 구동하면서 폴더를 여러개 만들고 싶다면

CMD mkdir f1 f2 f3
또는
CMD ["mkdir", "f1", "f2", "f3"]

ENV

컨테이너 안에서 사용할 환경변수 설정

ENV name sunghs
ENV url sunghs.tistory.com

ARG

도커파일 안에서만 사용되며 컨테이너 구동시에는 사용 못함.

ARG name=sunghs
ARG url=sunghs.tistory.com

두 명령어는 ${key}로 사용 가능하다.
echo ${name} = sunghs

WORKDIR

연속된 cd명령어를 제외해준다. 이후 명령어에 상대경로를 사용하면 ${WORKDIR}/ 부터 시작한다.

WORKDIR /usr/local/
RUN sh ./test.sh

/usr/lcoal/test.sh가 실행된다.

USER

사용자를 선택한다.

USER root
USER sunghs 등

Dockerfile 빌드

Dockerfile이 있는 위치에서 실행시키면 된다.
docker build -t 이미지명:버전명 .
태그 뒤에 . 을 빼서는 안된다.

간단한 예제

amazonlinux:latest를 DockerHub에 받아서
wget, java-openjdk11, which 패키지 설치
이후 test.txt 파일을 도커 이미지 안으로 이동

FROM amazonlinux:latest

USER root


RUN \
yum install -y wget \
&& amazon-linux-extras install -y java-openjdk11 \
&& yum install -y which

COPY test.txt /etc/test.txt

'DevOps' 카테고리의 다른 글

[Jenkins] Jenkins 기본 명령어  (0) 2020.04.10
[Docker] Docker 기본 명령어  (0) 2020.04.10

댓글