[CI/CD] Dockerfile 만들기(미완)

김진회·2023년 4월 18일
0

CI/CD

목록 보기
7/7

0. 개요

CI/CD 구축에서 Docker를 구축할 때, Dockerfile 작성을 하게 된다. 이 포스트에서는 Dockerfile을 작성하는 법과 구성을 알아보도록 한다.


1. DockerFile이란?

Docker 이미지를 만들기 위한 스크립트 파일이다. 도커 이미지에 대한 정보가 적혀있는 템플릿이라고 보면 된다.

  • 도커 이미지 빌드 방법
    docker build [옵션] [dockerfile 경로]

2. DockerFile 지시어

Dockerfile에는 크게 17가지의 지시어가 있고, 이를 사용해서 이미지의 정보를 구성한다.

  • 지시어는 대소문자를 구분하지 않지만, 다른 명령어와 구분을 위해 보통 대문자를 사용
  • 주석은 '#'을 사용
  • 줄바꿈은 '\'(백슬래시)을 사용

👉 더 자세한 내용은 공식 Docs 문서 에서 확인하자.

1) FROM

FROM은 Base 이미지를 지정하고 새로운 빌드 단계를 초기화한다. Dockerfile은 반드시 FROM으로 시작하고, Public Repository로부터 이미지를 pull해서 사용하기에 매우 간편하다.

FROM 이미지이름:버전
-> FROM ubuntu:18.04
  • ARG와 FROM의 상호작용
    • ARG로 선언한 변수를 쓸 수 있다.
    • 단, FROM 전에 선언한 ARG는 FROM 후에 쓸 수 없고, FROM 후에 쓸려면 FROM 뒤에 선언해야 한다.
      ARG VERSION1=latest   #version1 선언
      FROM busybox:$VERSION1   #version1 사용
      ARG VERSION2   #version2 선언
      RUN echo $VERSION2 > image_version   #version2 사용

2) RUN

이미지를 빌드할 때, 커맨드를 실행하여 이미지에 반영한다. shell폼은 직접 터미널에 입력하는 명령어의 형태와 비슷하고, exec폼은 각 단어를 "와 []로 감싸야한다.

RUN 커맨드 #shell폼
-> RUN /bin/bash -c 'echo hello'
RUN ["executable", "param1", "param2"] #exec폼
-> RUN["/bin/bash", "-c", "echo hello"]
  • exec폼은 JSON 배열로 해석되기 때문에 백슬래시에 주의해야한다.
    👉 c:\windows (X) -> c://windows (O)
  • exec폼은 ARG를 사용할 수 없다.

3) CMD

컨테이너가 시작될 때, 실행할 커맨드를 지정한다. (RUN과 시점이 다름)

CMD 커맨드 #shell폼
-> CMD /bin/bash -c 'echo hello'
CMD ["executable", "param1", "param2"] #exec폼
-> CMD["/bin/bash", "-c", "echo hello"]
  • CMD는 한 번만 사용될 수 있으며, 여러 번 나타날 시 마지막의 CMD만 실행된다.
  • RUN의 exec폼 주의사항과 동일하다.

4) LABEL

key-value 형식의 메타데이터를 이미지에 추가한다.

LAVEL 키=밸류 키=밸류 키=밸류 ...
-> 예시1 (한 줄)
LABEL "com.example.vendor"="ACME Incorporated" com.example.label-with-value="foo" version="1.0" description="This text illustrates
-> 예시2 (여러 줄)
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates
-> 예시3 (추천)
LABEL "com.example.vendor"="ACME Incorporated"  \
	com.example.label-with-value="foo"  \
	version="1.0"  \
	description="This text illustrates
  • 이미지의 라벨을 확인하려면 docker image inspect 명령어를 사용할 수 있다.
    docker image inspect --format='{{json .Config.Labels}}' 이미지이름
    -> 출력 결과
    {
      "com.example.vendor": "ACME Incorporated",
      "com.example.label-with-value": "foo",
      "version": "1.0",
      "description": "This text illustrates that label-values can span multiple lines.",
    }

5) EXPOSE

컨테이너가 대기할 포트를 지정한다. 프로토콜을 지정하지 않으면 default 값은 tcp이다.

EXPOSE 포트/프로토콜
-> EXPOSE 80/udp

6) ENV

key-value 형식의 환경변수를 설정한다.

ENV 키=밸류 키=밸류
-> LABEL의 예시들과 같음
ENV MY_NAME="John"  \
	MY_DOG=Rex  \
    MY_CAT=fluffy
  • docker inspect 명령어로 확인할 수 있다. 또한, docker run --env 키=밸류로 변경할 수 있다.
  • =를 빼고 사용해도 된다. 단, 이 방법으로는 여러 ENV를 설정할 수 없기 때문에 권장하지 않는다.

7) ADD

8) COPY

9) ENTRYPOINT

10) VOLUME

11) USER

12) WORKDIR

13) ARG

ARG 이름=값
-> ARG VERSION=18.04
-> FROM ubuntu:&VERSION

변수를 정의하여 재사용한다. 혹은 =값 을 생략하고, 사용자가 도커 빌드시 --build-arg <varname>=<value>를 이용하여 값을 임의로 할당해서 사용할 수 있다.

14) ONBUILD

15) STOPSIGNAL

16) HEALTHCHECK

17) SHELL

18) MAINTAINER (삭제됨)


3. 예시

직접 진행하고 작성했던 Dockerfile을 예시로 보겠다.

  • Jenkins DockerFile

    FROM jenkins/jenkins:lts
    
    USER root
    
    # install docker
    RUN apt-get update && \
        apt-get -y install apt-transport-https \
            ca-certificates \
            curl \
            gnupg2 \
            zip \
            unzip \
            software-properties-common && \
        curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
        add-apt-repository \
        "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
        $(lsb_release -cs) \
        stable" && \
        apt-get update && \
        apt-get -y install docker-ce
  • Nginx Dockerfile

    FROM nginx:stable-alpine
    
    COPY ./default.conf /etc/nginx/conf.d/default.conf
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    upstream backend {
        server backend:8080;
    }
    
    server{
        listen 80;
        listen [::]:80;
    
        server_name juso.p.ssafy.io; (서버URL)
    
        location / {
          return 301 https://$host$request_uri;
        }
    
        location /.well-known/acme-challenge/ {
            root /certbot;
        }
    }
    
    server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
    
        server_name  juso.p.ssafy.io; (서버URL)
        access_log   /var/log/nginx/nginx.vhost.access.log;
        error_log    /var/log/nginx/nginx.vhost.error.log;
    
        ssl                  on;
        ssl_certificate      /certbot/etc/live/juso.p.ssafy.io(서버URL)/fullchain.pem;
        ssl_certificate_key  /certbot/etc/live/juso.p.ssafy.io(서버URL)/privkey.pem;
    
        location /api {
            proxy_pass http://backend;
            proxy_set_header Host              $http_host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
    }
  • BackEnd Dockerfile

    FROM openjdk:11-jdk
    ARG JAR_FILE=./*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]

Reference

https://toramko.tistory.com/entry/docker-도커파일Dockerfile-의-개념-작성-방법문법-작성-예시

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

2개의 댓글

comment-user-thumbnail
2024년 8월 13일

Persib Bandung will soon find out their potential opponents in the 2024/2025 ACL Two in the drawing held in Kuala Lumpur, Friday (16/8/2024) afternoon. Persib is one of 32 teams competing in the event.
https://ru.nobartv.co.id/berita-terkini , https://es.nobartv.co.id/berita-terkini , https://th.nobartv.co.id/berita-terkini , https://fr.nobartv.co.id/berita-terkini
A total of 32 teams in the 2024/2025 ACL Two will be divided into 8 different groups, or each group will be filled by 4 teams. However, Persib is certain to only meet opponents from the East Asia Region. Because, of the 32 teams, 16 of them will enter the western region, while the remaining 16 are in the eastern region.
https://www.nobartv.co.id/berita-terkini , https://en.nobartv.co.id/berita-terkini , https://ko.nobartv.co.id/berita-terkini , https://ja.nobartv.co.id/berita-terkini , https://ar.nobartv.co.id/berita-terkini , https://hi.nobartv.co.id/berita-terkini
Persib has the status of a Pot 4 team in the Eastern Region of ACL Two 2024/25. Maung Bandung is in the same pot as Tampines Rovers (Singapore), Dynamic Herb Cebu (Philippines), and Eastern (Hong Kong). Automatically, these teams are certain not to be in the same group as Persib.

답글 달기
comment-user-thumbnail
2024년 10월 6일

The accumulated onto your blog site despite the fact paying off acceptance just many tid little submits. Gratifying strategy for honest, I will be bookmarking before you start acquire merchandise realization spgs right in place.

답글 달기