자세한 작성법은 공식 문서에 자세히 나와있고, 여기서는 대략적인 사용법에 대해서만 다룬다.
dockerfile api
Dockerfile reference
docs.docker.com
예시
FROM python:3.7
RUN apt-get -y update
RUN apt-get -y install vim
COPY ./ /usr/src/app
WORKDIR /usr/src/app
EXPOSE 1234
CMD python abc.py
이 이미지는
1) python:3.7 를 베이스로 하고,
2) 컨테이너에서 update명령을 실행하고,
3) vim을 설치한다
4) dockerfile 있는 로컬의 현재 디렉토리에 있는 내용을 컨테이너의 /usr/src/app에 옮긴다.
5) cd /usr/src/app
6) 1234포트를 개방한다.
7) 컨테이너가 실행될때 abc.py를 실행시킨다.
FROM
플랫폼과 기본 이미지를 설정한다.
FROM ubuntu:16.04
기본 이미지를 ubuntu 16.04로 한다
RUN
셸 스크립트 혹은 명령 실행한다.
이 명령은 캐시된다 apt-get update 같은 명령어는 다시 실행되지 않으므로 주의해야함
COPY
호스트에있는 디렉토리나, 파일을 docker이미지의 파일 시스템으로 복사하기 위해 사용
workdir로 어떤 디렉토리에 있을지 고려해야함.
이 명령으로 이미지에 다른 파일을 같이 넣을 수 있다.
COPY <local_path> <container_path>
local_path 에 있는 파일을 -> container_path로 복사한다.
WORKDIR
cd명령문 처럼 컨테이너 상에서 작업 디렉토리로 전환 위해서 사용
이 이후의 run, cmd, entrypoint등 명령문은 해당 디렉토리 기준으로 실행
WORKDIR tmp
이제 컨테이너 내부는 cd /tmp 를 한 상태와 같아진다.
모든 명령은 /tmp 디렉토리를 기준으로 적용
EXPOSE
리스닝 포트 지정위해 사용
docker run -p와 다른점
EXPOSE는 컨테이너에서 해당 포트를 열어두겠다의 의미다.
즉 EXPOSE 5500을 한다 해서, 호스트의 5500포트와 컨테이너의 5500포트가 포워딩 되는것이 아니고 컨테이너에 5500포트가 열려있기만 할 뿐이다.
이 열려있는 포트를 호스트와 연결시켜줄려면 -p 옵션을 통해 -p {host-port}:5500 호스트 포트와 포워딩을 해줘야함.
ENV
환경변수 설정하기 위해 사용
설정한 변수는 RUN, CMD, ENTRYPOINT에 사용된다.
ENV <key> <value>
ENV <key>=<value>
또한 변수로써도 사용 가능하다
ARG
이미지 빌드시 --build-arg옵션을 통해 넘길 수 있는 인자 정의
ex) ARG port로 인자를 설정하면
docker build --build-arg port = 8080
디폴트 값을 지정해주면 인자가 넘어오지 않을때 사용한다
=> ARG port = 80
설정된 인자 값은 ${인자명} 으로 사용할 수 있다. 또한 Dockerfile 내에서도 사용가능하다.
CMD start.sh -h 127.0.0.1 -p ${port}
ENTRYPOINT
컨테이너가 시작되었을때 수행할 명령. 두가지 형식이 있다
ENTRYPOINT ["executable", "par1", "par2"]
ENTRYPOINT command par1 par2
CMD
컨테이너가 시작되었을때 수행할 명령. 세가지 형식이 있다
CMD ["executable", "par1", "par2"]
CMD ["par1", "par2"]
CMD command parm1 parm2
CMD가 둘 이상 있을경우 가장 마지막 항목만 적용된다.
CMD의 사용 목적은 run으로 컨테이너 실행시 default 명령, entrypoint에게 넘겨주는 default 파라미터 등으로 쓰인다.
ENTRYPOINT 와 CMD의 차이
컨테이너 시작시 실행명령에 대한 default 지정 여부
만약 entrypoint를 사용하여 수행 명령을 정의하면 반드시 entrypoint에서 지정한 명령을 수행되도록 지정함 -> 무조건실행
허나 cmd를 사용하는 경우 컨테이너를 실행시 인자값을 주면 cmd값 대신 지정한 인자값으로 변경하여 실행되게함 -> default명령, default인자
또한 docker-compose에서 command에 내용이 있다면 CMD의 내용은 Override 되지만, entrypoint의 내용은 관계없이 실행된다.
참고 » ENTRYPOINT AND CMD
Dockerfile reference
docs.docker.com
LABEL
이미지에 메타데이터를 추가한다.
LABEL <key>=<value>,…
형태로 쓰이며, 한줄에 여러 레이블을 지정할 수도 있다.
여기서 지정한 레이블들은 inspect에서 확인할 수 있다.
주로 버전, 주석등 전달하고싶은 내용이 있을때 사용한다.
USER
사용자를 지정한다.
컨테이너 내에서 실행할 사용자(or UID,GID)를 지정한다.
RUN, CMD, ENTRYPOINT 명령은 사용자에 따라 실행된다.
ex) / 에 파일을 생성하려면 root 계정만 생성할 수 있다.
VOLUME
마운트할 볼륨을 선택한다.