Dockerfile 이해하기
Dockerfile 이해하기
Reference
Command
CMD
- 컨테이너 실행할 때, 호출하는 명령어.
- 다른 명령어들은 모두 build시에 수행하는 명령어지만, 이건, runtime에 수행함.
- CMD는 docker run할 때, overrides될 수 있음
sudo docker run [container_name] [command]
로 실행하면, CMD는 호출되지 않고, [command]가 수행ENTRYPOINT
- CMD와 거의 유사함
- run할 때, overrides되냐 안되냐의 차이
- 실행할 코드는 ENTRYPOINT로 정의하고, 디폴트 argument는 CMD로 정의하는 걸 추천
Dockerfile
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
run
sudo docker run [container_name] Docker
result
Hello Docker
RUN
- Run multiple line
RUN set -ex \ && apt-get update \ && echo "something"
ENV
- define environment path
ENV PYTHONPATH=/app
EXPOSE
https://docs.docker.com/engine/reference/builder/#expose
EXPOSE 80/tcp
EXPOSE 80/udp
EXPOSE 8080 5555 8888
Simple Build
FROM node:12-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
- FROM node:12-alpine : 이미지를 가져옴. alpine은 light한 리눅스
- WORKDIR /app : container내부의 해당 path를 working directory로 설정
- COPY package.json yarn.lock ./ : copy this, so that, if this files not changed, then use cache(밑에 COPY . . 와 별도로 먼저 복사하는 이유임.)
- RUN yarn install –production : 소스 코드 실행에 필요한 디팬던시 설치
- COPY . . : 현재 디렉토리의 소스들을 workdir로 복사
- CMD [“node”, “src/index.js”] : 컨테이너 실행할 때, 호출할 명령어.
- 위에 명령어들은 모두 build시에 수행하는 명령어지만, 이건, runtime에 수행함.
Multi-Stage Builds
- Doc
- only last stage is contained on image.
Maven/Tomcat Example
- name the first stage as ‘build’
- COPY –from=build : copy files from ‘build’ stage ```dockerfile FROM maven AS build WORKDIR /app COPY . . RUN mvn package
FROM tomcat COPY –from=build /app/target/file.war /usr/local/tomcat/webapps
### React Example
```dockerfile
FROM node:12 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html