[Docker] Dockerfile
Dockerfile
-
Dockerfile 을 기반으로 Docker Image 를 빌드할 수 있다.
-
docker build
명령어를 사용
$ docker build [OPTIONS] <Path>
-
<Path>
에는 Dockerfile 이 위치한 경로만 입력한다. (Dockerfile 을 자동으로 찾아서 읽는다.) -
<Path>
에는 URL 이 들어갈 수도 있다.
docker build OPTIONS
-
-t
:--tag
와 동일
생성할 이미지의<ImageName>:<tag>
를 설정한다. (대문자 사용불가) -
-f
:--file
와 동일
Dockerfile 을 구체적으로 지정한다.
기본값은<PATH>/Dockerfile
이다. -
--rm
: 이미지 생성 중간과정에서 생성되는 컨테이너를 이미지 생성 후 제거한다.
기본값은 true 이다.
Make Dockerfile
Command
FROM
기준이 될 Docker Image 를 지정한다. (<ImageName>:<tag>
형태)
지정한 이미지가 없을경우 자동으로 pull 을 시도한다.
FROM ubuntu:18.4
RUN
Shell 명령어 실행 (Image 빌드할 때 실행)
RUN apt-get -y update
ubuntu 패키지를 설치하기 위해 apt
명령어를 사용하면 아래와 같은 경고가 나타난다.
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
따라서 Dockerfile 에서는 apt-get
을 사용하자.
CMD
컨테이너가 실행될 때 실행할 Shell 명령어 또는 파일
- 여러번 사용해도 마지막에 작성한 명령어만 적용된다.(Override)
docker run
명령어의[COMMAND]
의 기본값이 된다.[COMMAND]
값을 입력시CMD
를 Override 한다.- 마지막에 작성하는 것을 권장
CMD /bin/bash
WORKDIR
명령어가 실행될 경로 설정
-
Shell 에서의
cd
와 유사하다. -
WORKDIR
에 해당하는 경로가 없을경우 자동으로 해당 디렉토리들을 생성
WORKDIR /tmp/tmp_project
COPY
HOST 의 파일과 디렉토리를 이미지에 복사한다.
- 복사할 경로가 이미지 내에 없을 경우 자동으로 만든다.
- 컨테이너의 설정경로는 절대경로만 설정가능하다.
- 디렉토리를 복사할 경우 컨테이너의 복사경로 마지막 디렉토리에 호스트의 디렉토리(폴더)가 디렉토리 자체로 들어가는 것이 아니라 경로의 마지막 디렉토리명으로 변경된다.
(업로드 형태) - 복사하려는 파일 또는 디렉토리가 이미 존재할 경우 덮어씌운다.
- 호스트의 경로는 Dockerfile 이 위치한 경로 상위로 갈 수 없다.
COPY . /srv/tmp_project
SHELL
-
Default Shell(기본 셸)을 재정의한다.
-
JSON 형식으로 작성
-
리눅스의 기본값 :
["/bin/sh", "-c"]
SHELL ["/bin/bash", "-c"]
RUN git clone <URL>
SHELL ["/bin/bash", "-c"]
RUN pyenv install 3.6.6
Bash OPTIONS
-
-c
: 문자열(String)에 의해 명령어가 인식된다. -
-l
:--login
과 동일
bash 를 로그인 셸로 호출된 것처럼 작동시킨다.
-l
옵션으로 각 명령어마다 셸을 지정하는 것이 아닌 로그인 셸을 재정의할 수 있다.
# Set Login Shell To Bash
SHELL ["/bin/bash", "-l", "-c"]
# RUN
RUN git clone <URL>
RUN pyenv install 3.6.6
로그인 셸을 변경하였을 때 부작용으로 에러 및 경고가 나타날 수 있다.
ENV
환경변수 설정
- 환경변수 한개 설정 형태 :
ENV <Key> <Value>
- 환경변수 다수 설정 형태 :
ENV <Key1>=<Value1> <Key2>=<Value2> . . .
ENV TMPVAR 1234
ENV TMPVAR1=1111 TMPVAR2=2222
환경변수 한개를 설정할 때
ENV TMPVAR=1234
로 해도 작동한다.
EXPOSE
런타임에 지정된 포트에서 수신대기
- publish 가 아니다. publish 는
docker run -p
가 해당된다. - 수신 프로토콜(TCP 또는 UDP)을 지정할 수 있다.(기본값은 TCP)
EXPOSE 60/tcp
EXPOSE 7777/udp
EXPOSE 80
Leave a comment