Dockerfile 작성방법

선종우·2023년 6월 21일
0

1. Dockerfile이란?

  • Dockerfile은 도커가 이미지를 생성하기 위한 명령어를 모은 파일이다.

2. 작성방법

ARG C
1) FROM <이미지명>[:<tag>] 
2) RUN <command> or RUN ["executable", "param1", "param2"]
3) CMD command param1 param2 or
CMD ["param1", "param2"](as default parameter to entrypoint) or
CMD ["executable", "param1", "param2"]
4) EXPOSE <port>[<port>/[protocol]...>
5) ENV <key>=<value>
6) ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src> ... <dest>
7) COPY [--chown=<user>:<group>] [--chmod=<perms>] <src> ... <dest>
8. ENTRYPOINT ["executable", "param1", "param2"](권장) or
 ENTRYPOINT command param1 param2
9. WORKDIR /path/to/workdir
10. ARG <name>=[<default value>]
  1. FROM : 이미지의 base 이미지를 설정
  2. RUN : 새로운 layer에서 명령어를 실행하고 commit한다. commit된 이미지는 Dockerfile의 나머지 단계에서 사용된다.
  3. CMD : Dockerfile에는 1개의 CMD만 존재할 수 있음. 만약 여러 개의 CMD를 사용하면 마지막 CMD만 적용됨. CMD의 주 목적은 컨테이너 실행의 default를 제공하기 위한 것이다. 만약 명령문이 없다면 parameter는 ENTRYPOINT에서 사용된다. 명령문이 없다면 반드시 ENTRYPOING가 있어야 한다. Docker run 시점에서 명령어를 넘겨준다면 CMD는 무시된다.
  4. EXPOSE : 도커에게 컨테이너가 지정된 PORT로 listen할 것임을 알려준다. 그러나 이 구문이 있다고 해서 port가 publish되는 것은 아니다. Dockerfile을 읽는 사람을 위한 설명문 정도로 이해하면 된다. 실제 publish하려면 run 명령어에 -p 옵션을 줘야 한다.
  5. ENV : 환경변수를 설정한다.
  6. ADD : 파일, 디렉터리, 원격지 파일을 src에서 이미지의 dest로 복사한다.(상대경로를 사용할 경우 WORKDIR에 파일을 복사한다.) ADD의 경우 COPY와 다르게 부가적인 작동을 하기 때문에 Reference에서는 COPY사용을 권고한다.
  7. COPY : src의 파일, 디렉터리를 dest에 복사한다.
  8. ENTRYPOINT : docker run에 선언된 cmd argument는 ENTRYPOINT 뒤에 붙으며, CMD에 설정된 명령을 덮어쓴다.
    ex) docker run <image> -d -> -d argument를 entrypoint에 전달함
    에서 실행된 명령어 라인은 ENTRYPOINT이후 실행되며, CMD를 덮어쓴다.
  9. WORKDIR : WORDIR선언 후 명령어(RUN, CMD, ENTRYPOINT, COPY, ADD)가 실행될 디렉터리를 설정한다.
  10. ARG : 사용자가 builder하는 시점에 변수를 주입할 수 있게 한다.(--build-arg <varname>=<value>)(docker history에 내용이 남기때문에 비밀번호 등을 넘기는 건 좋지 않음)

3. 예제 파일

  • 생활코딩 예제
FROM ubuntu:20.04  -> base image 설정
RUN apt update && apt install -y python3 -> 컨테이너에서 실행할 명령어, build시점에 실행되는 명령어 따라서 이미지에 반영됨
# RUN mkdir -p/var/www/html
WORKDIR /var/www/html                 -> 디렉터리가 없다면 디렉터리를 생성하고, cd dir하고 향후 각종 명령어의 실행 경로를 지정
1. RUN echo "Hello, <String> docker > index.html  -> workdir에서 명령어가 실행된다.
2. COPY ["index.html", "."] -> host의 index.html을 WORKDIR로 복사한다.
CMD ["python3", "-u", "-m", "http.server"] -> docker에서 python 서버 실행, container 실행 시점에 실행되는 명령어
* docker run -p 8888:8000 -name web-server web-server-build pwd -> CMD 실행구문 무시하고 pwd 실행
  • 내가 작성한 Springboot 예제
FROM amazoncorretto:17-alpine
ARG JAR_FILE=*.jar
WORKDIR /application
COPY ${JAR_FILE} ./app.jar
RUN mkdir -p images/event && mkdir -p images/club
ENTRYPOINT ["java", "-Dspring.profiles.active=prod","-jar", "app.jar"]
  • 내가 작성한 Springboot 예제2
FROM openjdk:17
ARG  JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]

0개의 댓글