본문 바로가기

Dockerfile 자주 사용되는 명령 (이전 완료)

자세한 작성법은 공식 문서에 자세히 나와있고, 여기서는 대략적인 사용법에 대해서만 다룬다.
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

마운트할 볼륨을 선택한다.