내 서버를 도커 컨테이너로 띄우기 위해서는 도커파일을 작성하는 방법을 알아야합니다.
백엔드 개발자로서는 무조건 공부해두는 것을 추천합니다.
코멘트: '#'를 사용해서 해당줄에 적습니다.
공백: '#'나 지시어(RUN 등) 앞에 공백은 무시되지만 인수로 전달된 경우는 공백이 유지됩니다.
줄바꿈: `(backtick) 또는 /(backslash)를 이용해서 해당 줄의 명령어를 끝냅니다.
# 주석입니다
RUN echo hello
RUN echo "hello \f
world"
# 결과물 > hello world
RUN echo hello /
# 결과물 > hello
ENV FOO=bar
RUN echo $FOO
# 변수 적용 > RUN echo bar
도커 빌드시에만 필요한 경우 단일 명령어로 설정하거나 ARG로 설정하는 것을 추천합니다.
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y
FROM --platform=linux/amd64 node:18-alpine as first
COPY /app /app
...
FROM node:18-alpine
# first단계에서 빌드하거나 가져온 폴더 등을 '--from'을 통해 사용할 수 있다
COPY --from=first /app /app
RUN 명령어에서 실행하는 결과는 캐싱되어 다음 단계에서 사용할 수 있습니다.
캐싱 무효화는 "--no-cache" 플래그로 가능합니다("docker build --no-cache").
이미지를 실행할 때 실행될 명령어를 설정합니다.
CMD로 제공된 기본값이 없는 경우에는 'ENTRYPOINT"로 제공해야 합니다.
CMD 명령어는 도커파일에 딱 한번만 사용합니다. 둘 이상을 나열하는 경우 마지막 CMD만 적용 됩니다.
CMD와 ENTRYPOINT 모두 JSON 배열 형식으로 작성되어야 합니다.
1. ENTRYPOINT & CMD 둘다 없는 경우 : 에러
2. ENTRYPOINT shell형식 & CMD 모든경우 : ENTRYPOINT의 명령어 적용
3. ENTRYPOINT exec형식 & CMD 명령어 : ENTRYPOINT 명령어 + CMD 명령어
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test
image: test-img
command: ["node"] // = ENTRYPOINT 동일
args: ["main"] // = CMD 동일
# hom으로 시작하는 파일
COPY hom* /mydir/
# home.txt 처럼 특정 위치 와일드카드 처리
COPY hom?.txt /mydir/
EXPOSE 3000
EXPOSE와 관계없이 "docker run -p <'host-port'>:<'container-port'>"방식으로 리디렉션이 가능합니다.
# docker build -t test-image --build-arg NODE_ENV=test
# NODE_ENV에는 test가 들어갑니다
# 기본값 설정가능
ARG NODE_ENV = development
.gitignore 파일처럼 도커 이미지 빌드에 필요하지 않은 목록들을 제외시킬 수 있습니다. 도커 이미지의 크기 감소에도 도움이 됩니다.
예시처럼 Dockerfile과 같은 패턴으로 파일명을 작성해야 합니다.
# Dockerfile
FROM node:18-alpine
ENV FOO=bar
RUN echo $FOO
COPY package.json .
---
# Dockerfile.dockerignore
package.json