[컴][유틸] Dockerfile


도커 / 다커 / 도커파일

Dockerfile

기본적으로 Dockerfile 의 syntax 는 아래와 같은 모양을 갖는다.

  • Dockerfile 에 적힌 순서대로 실행된다.
  • INSTRUCTION 이나 #(comment) 앞에 공백은 없어야 한다.(가능은 하지만, 이건 backward compatibility 때문이다.)
  • \ 은 Line continuation characters 이다.
  • # directive=valueparser directives 이다.
# Comment
INSTRUCTION arguments

# example
RUN echo 'we are running some # of cool things'
RUN echo hello \
world

parser directives

말그대로 parser 에게 "어떻게 해라" 라고 가르치는 지시자 같은 것이다.

현재 아래 2가지를 지원한다.

  • syntax
  • escape : escape 문자를 어떤것으로 할지 정한다. window 등에서는 이미 \가 쓰이기 때문에, \ 를 다른 것으로 정해서 사용해야 하는데, 이럴때 이 directive 를 사용하면 된다.
# syntax=docker.io/docker/dockerfile:1
# escape=\ (backslash)

변수지정

  • ${foo:-word} : foo 변수가 없으면 word 를 사용
  • ${foo:+word} : foo 변수가 있으면 word 를 사용
ENV foo /bar
WORKDIR ${foo}    # WORKDIR /bar

.dockerignore file

docker CLI 가 docker deamon 에 context 를 보내기 전에, .dockerignore file 을 확인한다.

아래처럼 작성하면 된다. 이 match rule 은 Go의 filepath.Match rules 을 따른다고 한다.

# comment
*/temp*     --> root 의 모든 level 1 의 subdirectory 의 temp* file
*/*/temp*
temp?       --> tempa, tempb 등 temp뒤에 character 1개가 붙은 file

# 순서대로 읽으면 된다. 
# - 아래는 모든 .md 를 exclude 한다.
# - README.md 는 exclude 에서 제외한다.
# - README-secret.md 는 exclude 한다.
*.md
!README.md
README-secret.md

Instructions

  • FROM
  • RUN
    • RUN apt-get update && apt-get install -y x11vnc xvfb firefox
  • CMD
  • LABEL
  • MAINTAINER (deprecated)
  • EXPOSE
    • EXPOSE 5900 : container 에게 tcp 5900 번 port 를 listen 하라고 알려준다.
    • EXPOSE 80/tcp
    • docker run -p 80:80/tcp, 이렇게 -p option 으로 override 된다.
    • docker run -P : -P option 에 의해 EXPOSE 에 적힌 port 가 실제로 publish 된다.
  • ENV
  • ADD
    • ADD --chown=myid:mygroup home.txt relativeDir/
    • file 을 image 로 copy
    • 자동으로 recursive 하게 copy 를 해준다.
    • Best practices ADD or COPY : copy 가 더 선호된다.
  • COPY
    • COPY --chown=myid:mygroup home.txt relativeDir/
    • file 을 container 로 copy
  • ENTRYPOINT
    • docker 를 실행파일처럼 사용하게 해준다. docker run <image> -d 라는 명령어를 실행하면, -d 가 entrypoint 의 parameter 로 전달된다.
    • 예를 들어 ENTRYPOINT 를 'python3' 로 해놨다면, docker run <image> a.py 라고 치면, docker 가 load 되고 나서, python3 a.py 가 실행된다.
  • VOLUME
  • USER
  • WORKDIR
  • ARG
  • ONBUILD
    • image 에 trigger instruction 을 넣을 수 있다. 이 trigger instruction 은 추후에 사용된다. 예를 들면 docker image 가 다른 build 의 base build 로 사용되는 경우에, 즉, docker image 를 하나 받고 나서, 그 것을 기반으로 build 를 하려는 경우에 쓰일 수 있다.
  • STOPSIGNAL
  • HEALTHCHECK
  • SHELL

examples

# Firefox over VNC
#
# VERSION               0.3

FROM ubuntu
ENF myName2 Gaed
ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy
WORKDIR /home/gaga

# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
RUN echo ${myName2}
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'

# home.txt file 을 docker image 내의 /home/gaga/relativeDir 로 copy
# --chown 은 linux 에서만 쓰이는데, file 에 대해 소유자를 변경시켜준다.
# --chown 이 없다면, 0 에대한 UID, GID 를 사용한다.(아마도 root)
ADD --chown=myid:mygroup home.txt relativeDir/

EXPOSE 5900
EXPOSE 80/tcp
CMD    ["x11vnc", "-forever", "-usepw", "-create"]

See Also

Reference

  1. Dockerfile reference | Docker Documentation

댓글 없음:

댓글 쓰기