Docker이미지를 생성할때 기반이 되는 이미지를 지정.
모든 Dockerfile은 FROM
으로 시작해야 한다.
# Node.js 14버전을 기반으로 이미지를 생성한다.
FROM node:14
이미지를 빌드하는 동안 실행될 명령어를 작성
주로 패키지 설치, 환경 설정 등에 사용
# 리눅스 패키지 매니저로 curl설치하기
RUN apt-get update && apt-get install -y curl
컨테이너가 실행될 때 기본으로 실행되는 명령을 지정
마지막에 선언된 단 하나만 유효.
# 컨테이너가 실행될 때 자동으로 node app.js 실행
CMD ["node", "app.js"]
node app.js
가 아닌 echo “Hello”
가 실행된다.```bash
docker run my-node-image echo "Hello"
```
컨테이너가 실행될 때 반드시 실행되어야 할 주 명령을 지정
마지막에 선언된 단 하나만 유효.
CMD로부터 인자를 전달받아 사용 가능.
# 실행결과 : python3 app.py
ENTRYPOINT ["python3"]
CMD ["app.py"]
호스트(로컬 시스템)의 파일이나 디렉토리를 컨테이너로 복사
# 현재 디렉토리의 index.html을 컨테이너 내부의 Nginx 디렉토리로 복사
COPY index.html /usr/share/nginx/html/
COPY
와 유사하지만 몇가지 추가 기능을 제공한다.
COPY | ADD | |
---|---|---|
기능 | 단순 기능 | 추가 기능 제공 |
원격 소스 처리 | 로컬 파일에만 사용가능 | 원격 URL에서 파일 다운로드 가능 |
자동 압축 해제 | X | 압축된 파일을 자동으로 압축해제 |
COPY
: 단순하고 명확한 작업에 적합ADD
: 부가적인 기능이 있어 다소 불투명환경 변수를 설정
docker run
을 함께 사용하는 경우, 환경변수 덮어쓰기가 가능# 기본 환경 변수 설정
ENV APP_MODE=production
docker run -e APP_MODE=development my-app
컨테이너 내에서 작업 디렉토리를 지정
후속 명령어들이 이 디렉토리 내에서 실행되도록 할 수 있다.
# 컨테이너의 /app에서 명령어가 실행되도록 한다.
WORKDIR /app
/app
→ /src
# 베이스 이미지
FROM node:14
# 첫 번째 작업 디렉토리 설정
WORKDIR /app
# /app 디렉토리에서 파일 복사
COPY . .
# 절대 경로로 하위 디렉토리 설정
WORKDIR /src
# /src 디렉토리에서 의존성 설치
RUN npm install
/app
→ /app/src
# 베이스 이미지
FROM node:14
# 첫 번째 작업 디렉토리 설정
WORKDIR /app
# /app 디렉토리에서 파일 복사
COPY . .
# 상대 경로로 하위 디렉토리 설정
WORKDIR src
# /app/src 디렉토리에서 의존성 설치
RUN npm install
# 베이스 이미지
FROM node:14
# 첫 번째 작업 디렉토리 설정
WORKDIR /app
# /app 디렉토리에서 파일 복사
COPY . .
# 상위 디렉토리로 이동
WORKDIR ..
# / 디렉토리로 이동된 상태에서 실행
RUN ls
컨테이너에서 외부에 노출할 포트를 지정
EXPOSE 3000
EXPOSE
는 컨테이너 내부 포트를 열어놓는 것일 뿐, 실제로 외부와 포트를 연결하는 건 아니다. 외부와 연결하려면 docker run
명령어에서 -p
옵션을 사용해야 한다.FROM ubuntu:20.04
EXPOSE 80
docker run -p 8080:80 my_image
컨테이너의 80번 포트를 호스트의 8080번 포트와 연결 이제 브라우저에서 localhost:8080
으로 접속하면, 컨테이너 내부에서 실행 중인 웹 서버에 접근할 수 있다.# 베이스 이미지
FROM node:14
# 작업 디렉토리 지정
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
docker build -t express-deepdive .
docker run -p 3000:3000 express-deepdive
# Ubuntu 20.04를 베이스 이미지로 사용
FROM ubuntu:20.04
# 환경 변수 설정
ENV MY_APP_NAME=express-deepdive
ENV MY_APP_VERSION=1.0
# 환경 변수 값을 확인하기 위해 작업 디렉토리를 설정
WORKDIR /app
# 단순한 쉘 스크립트 실행
# CMD echo "App Name: $MY_APP_NAME, Version: $MY_APP_VERSION"
CMD ["bash", "-c", "echo \"App Name: $MY_APP_NAME, Version: $MY_APP_VERSION\""]
출처: https://malwareanalysis.tistory.com/233
파일 복사하지 않고 다운로드
FROM busybox:1.34.1
RUN mkdir test
ADD https://google.com/index.html /test/
docker build -t local:add .
docker run --rm -it local:add /bin/sh
/ # cd test
/test # ls
RUN
명령어를 통해 이미지 빌드시점에 하는 이유CMD
나 ENTRYPOINT
는 주로 컨테이너가 실행될 때 실행될 명령어를 지정하는 데 사용됩니다. 패키지 설치는 일반적으로 한 번만 실행되면 되는 작업이므로, 컨테이너 실행 시점이 아니라 빌드 시점에 처리하는 것이 더 적합합니다.
RUN
명령어로 이미 패키지가 설치되어 있기 때문에 컨테이너 실행 시점에 매번 패키지를 설치할 필요가 없습니다. 만약 CMD
나 ENTRYPOINT
에서 패키지를 설치한다면, 컨테이너가 시작될 때마다 설치 작업이 발생하여 불필요한 리소스를 소모하게 됩니다.RUN
명령어로 이루어지면, 이전에 동일한 명령어를 사용한 빌드를 캐시로 재사용할 수 있어 빌드 속도가 빨라집니다. 반면, CMD
에서 설치 작업을 하면 매번 새로 설치해야 하므로 캐시를 활용할 수 없습니다.