DockerFile


หลักๆมี

  • FROM
  • WORKDIR
  • ADD
  • COPY
  • EXPOSE
  • CMD
  • ENTRYPOINT

FROM

FROM ImageName
...

เป็นการกำหนด images ที่เราต้องการจะใช้

# example DockerFile
FROM node
...

WORKDIR

WORKDIR /path/to/workdir

เป็นส่วนกำหนดว่าเมื่อ container running เราจะให้ทำงานที่ไหน

# example DockerFile
FROM node
WORKDIR /path/to/workdir
...

ADD && COPY

ใช้ทำการเพิ่มไฟล์จากต้นทางไปยัง container ทั้งสองมีความแตกต่างกันนิดหน่อย

  • ADD
ADD <src> <dest>
..
# or
ADD ["<src>", "<dest>"]
  • COPY
COPY <src> <dest>
..
# or
COPY ["<src>", "<dest>"]

ที่ต่างกันคือ COPY สามารถเพิ่มไฟล์จาก local ได้เท่านั้น ขณะเดี่ยวกันที่ ADD ก้ทำได้เหมือนกันและสามารถใช้ เป็น path url ได้ เช่น
จาก ปกติจะใช้

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

เหลือ แค่นี้ได้เลย

ADD http://example.com/big.tar.xz /usr/src/things/

EXPOSE

EXPOSE <port> [<port>/<protocol>...]

เป็นการกำหนด port ที่ App หรือ Service นั้นใช้

# example dockerfile
FROM nginx
WORKDIR /path/to/workdir
EXPOSE 80

CMD & ENTRYPOINT

CMD ["<command line>", "arg1", "arg2"]
ENTRYPOINT ["<command line>", "arg1", "arg2"]
  • CMD
CMD <command line> arg1 arg2 //(shell form)
#or
CMD ["<command line>", "arg1", "arg2"] //(exec form)

เป็นการกำหนด default execute หรือ default argument ของ Docker image เพื่อใช้ใน container

# example 
FROM ubuntu
CMD ["echo", "Hello"]

build and run

$ docker build -t demo-cmd .
$ docker run demo-cmd 
...
Hello

จะเห็นได้ว่าเมื่อสั่ง run container จะได้เป็น Hello ที่นี้เมื่อลองสั่ง run อีกครั้งเป็น

$ docker run demo-cmd /bin/bash echo World
...
World

จะเห็นได้ว่า เมื่อสั่ง run ใหม่ มีการ echo world ไป มันจะได้ค่า ที่เรา echo ออกมาเป็น world แทน

  • Entrypoint
ENTRYPOINT <command line> arg1 arg2 //(shell form)
#or
ENTRYPOINT ["<command line>" ,"arg1", "arg2"] //(exec form)

เป็นการกำหนด execute ที่ต้องการใช้ใน container เหมือนๆ กับ CMD
ต่่างกันตรงที่ ENTRYPOINT เหมือนเป็นการกำหนด ค่านั้นๆ ไว้ตายตัว ไม่สามารถแทนที่คำสั่งเดิมที่สั่งให้ทำงานไปได้

# example 
FROM ubuntu
ENTRYPOINT ["echo", "Hello"]

build and run

$ docker build -t demo-entrypoint .
$ docker run demo-entrypoint 
...
Hello

จะเห็นได้ว่าเมื่อสั่ง run container จะได้เป็น Hello เหมือนกันกับ CMD ที่นี้ลองสั่ง run อีกครั้งเป็น

$ docker run demo-entrypoint /bin/bash echo World
...
Hello World

จะเห็นได้ว่า การส่งค่า ไปใน container สิ่งที่ได้จะเป็นการต่อไปเป็น Hello World

และยังสามารถใช้งาน CMD ร่วมกับ ENTRYPOINT ได้เช่นกันดังนี้

# example
FROM ubuntu
CMD ["World"]
ENTRYPOINT ["echo", "Hello"]

ผลลัพท์ ที่ได้จะเป็น Hello World


May 24, 2020