
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=productiondocker 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 80docker 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에서 설치 작업을 하면 매번 새로 설치해야 하므로 캐시를 활용할 수 없습니다.