# 3. dockerfile-syntax

Dockerfile syntax 정리

## All about Dockerfile syntax

* FROM
  * 베이스 이미지 지정
* RUN
  * 컨테이너 내에서 실행할 쉘 명령어를 지정하여 패키지 또는 소프트웨어 설정
* WORKDIR
  * 명령이 실행될 작업 디렉토리를 지정
  * 해당 디렉토리가 없다면 생성됨
* COPY
  * 호스트 머신의 파일을 컨테이너 내부로 복사
* ADD
  * COPY와 유사. 추가적인 기능 제공
  * 로컬 파일이나 URL 복사할 수 있으며, 압축 파일 자동으로 해제하고 원격 파일 다운로드 가능
* CMD
  * 컨테이너가 시작될 때 실행하는 명령을 설정
  * 도커 파일에서 한 번만 사용해야 함
  * 동시에 여러 개의 CMD 지시문을 사용할 수 있지만, 마지막 CMD만 적용됨
* ENTRYPOINT
  * 컨테이너가 시작될 때 실행되는 실행 파일 설정
  * CMD와 유사하지만 ENTRYPOINT는 항상 실행됨
  * CMD는 ENTRYPOINT의 인수로 사용됨
* ENV
  * 환경 변수를 설정
* ARG
  * 빌드 중에 전달되는 인수를 정의합니다.
* EXPOSE
  * 컨테이너가 노출할 포트 설정
* VOLUME
  * 호스트 머신과 컨테이너 간에 볼륨을 공유할 수 있도록 설정
* USER
  * 컨테이너가 실행될 사용자를 설정
* HEALTHCHECK
  * 컨테이너의 상태를 확인하는 방법을 설정
* LABEL
  * 이미지에 메타데이터를 추가
  * LABEL version="1.0"
* SHELL
  * 기본 쉘 지정
  * SHELL \["/bin/bash", "-c"]
* STOPSIGNAL
  * 컨테이너가 종료될 때 보내질 시그널을 지정
  * STOPSIGNAL SIGTERM

### sample

#### Node.js Dockerfile sample

```Dockerfile
FROM node:20.11-alpine

RUN apk update && apk add bash sudo vim

WORKDIR /app

COPY . .

RUN npm cache clean --force && rm -rf node_modules && npm install

EXPOSE 3000

CMD ["npm", "run", "start"]
```

#### Python\&Django Dockerfile sample

```Dockerfile
FROM python:3.11

ENV PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["uvicorn", "myproject.asgi:application", "--host", "0.0.0.0", "--port", "8000"]
```

#### Multistaging nodejs sample

```Dockerfile
FROM node:14 AS development

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "run", "dev"]

FROM node:14 AS production

WORKDIR /app

COPY package*.json ./
RUN npm install --production

COPY . .

RUN npm run build

CMD ["npm", "start"]
```

Build Docker image multistaging

```shell
docker build --target development --t node:dev .
docker build --target production --t node:dev .
```

## docker compose

```shell
docker-compose up [options] [SERVICE...]
docker compose up

docker compose up -d(--detach)
- 컨테이너를 백그라운드 모드로 실행

docker compose up --force-recreate
- 변경 사항이 없어도 컨테이너를 강제로 다시 생성

docker compose images

docker compose down
docker compose build
docker compose start

docker compose stop
docker compose stop -t 20 # stop with a timeout

docker compose restart

docker compose rf
docker compose rf -f

docker compose logs
docker compose logs -f # follow log output

docker compose exec [my-service] bash
docker compose ps
```
