CI/CD 구축에서 Docker를 구축할 때, Dockerfile 작성을 하게 된다. 이 포스트에서는 Dockerfile을 작성하는 법과 구성을 알아보도록 한다.
Docker 이미지를 만들기 위한 스크립트 파일이다. 도커 이미지에 대한 정보가 적혀있는 템플릿이라고 보면 된다.
docker build [옵션] [dockerfile 경로]
Dockerfile에는 크게 17가지의 지시어가 있고, 이를 사용해서 이미지의 정보를 구성한다.
👉 더 자세한 내용은 공식 Docs 문서 에서 확인하자.
FROM은 Base 이미지를 지정하고 새로운 빌드 단계를 초기화한다. Dockerfile은 반드시 FROM으로 시작하고, Public Repository로부터 이미지를 pull해서 사용하기에 매우 간편하다.
FROM 이미지이름:버전
-> FROM ubuntu:18.04
ARG VERSION1=latest #version1 선언
FROM busybox:$VERSION1 #version1 사용
ARG VERSION2 #version2 선언
RUN echo $VERSION2 > image_version #version2 사용
이미지를 빌드할 때, 커맨드를 실행하여 이미지에 반영한다. 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를 사용할 수 없다.컨테이너가 시작될 때, 실행할 커맨드를 지정한다. (RUN과 시점이 다름)
CMD 커맨드 #shell폼
-> CMD /bin/bash -c 'echo hello'
CMD ["executable", "param1", "param2"] #exec폼
-> CMD["/bin/bash", "-c", "echo hello"]
exec폼
주의사항과 동일하다.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.",
}
컨테이너가 대기할 포트를 지정한다. 프로토콜을 지정하지 않으면 default 값은 tcp이다.
EXPOSE 포트/프로토콜
-> EXPOSE 80/udp
key-value 형식의 환경변수를 설정한다.
ENV 키=밸류 키=밸류
-> LABEL의 예시들과 같음
ENV MY_NAME="John" \
MY_DOG=Rex \
MY_CAT=fluffy
docker inspect
명령어로 확인할 수 있다. 또한, docker run --env 키=밸류
로 변경할 수 있다.=
를 빼고 사용해도 된다. 단, 이 방법으로는 여러 ENV를 설정할 수 없기 때문에 권장하지 않는다.ARG 이름=값
-> ARG VERSION=18.04
-> FROM ubuntu:&VERSION
변수를 정의하여 재사용한다. 혹은 =값
을 생략하고, 사용자가 도커 빌드시 --build-arg <varname>=<value>
를 이용하여 값을 임의로 할당해서 사용할 수 있다.
직접 진행하고 작성했던 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"]
https://toramko.tistory.com/entry/docker-도커파일Dockerfile-의-개념-작성-방법문법-작성-예시
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.