Chức năng từng lệnh trong Dockerfile

cuong@techmaster.vn

https://github.com/TechMaster/CoolAlpine

FROM baseimage:tag

Xây dựng container kế thừa từ Docker image khác
 

Ví dụ: alpine kế thừa từ scratch

FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/sh"]

Text

scratch : image rỗng , làm gốc cho tất cả image khác

rootfs.tar.xz là boot (trình khởi động) của Alpine Linux chứa các tập lệnh thiết yếu nhất

Để tạo ra rootfs.tar.xz cần phải chạy bash script.

https://github.com/gliderlabs/docker-alpine/blob/master/builder/scripts/mkimage-alpine.bash


Ví dụ từ GliderLabs. Bạn có thể điều chỉnh thay đổi tuỳ ý nhưng nên tạo ra rootfs.tar.xz tối giản, càng nhỏ, càng tốt

FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/sh"]

Alpine:latest Dockerfile

CMD ["/bin/sh"] chạy Almquist shell

khi docker run. Có thể thay thế bằng lệnh khác khi docker run hoặc tạo image kế thừa

CMD ["nginx", "-g", "daemon off;"]

Lệnh chạy nginx ở background trong image Nginx:alpine

LABEL maintainer="Trịnh Minh Cuong<cuong@techmaster.vn>"
MAINTAINER Trịnh Minh Cường <cuong@techmaster.vn>

Thông tin người bảo trì Dockerfile

hoặc

cách 2 đã cũ

COPY tách hay gộp?

FROM alpine:latest
COPY start.sh /
COPY start.fish /
FROM alpine:latest
COPY start.sh start.fish /

Copy gộp, chỉ tạo thêm 1 layer trong image

sẽ hiệu quả hơn !

Kém hiệu quả, khiến image bị phân mảnh

thành nhiều layer

COPY vs ADD

ADD có thể tải file từ Internet

COPY thuần tuý copy file từ host vào image

FROM alpine:latest
ADD https://foo.com/setup.sh /
FROM alpine:latest
COPY https://foo.com/setup.sh /

Chạy !

Không chạy

FROM alpine:latest
ADD https://fishshell.com/files/2.7.0/fish-2.7.0.tar.gz /
RUN tar -xzvf /fish-2.7.0.tar.gz \
  && rm /fish-2.7.0.tar.gz \
  && rm -rf /fish-2.7.0

Tải file fish-2.7.0.tar.gz từ Internet bung nén, sau đó xoá

4 layers, 9.9 Mb

apk add --no-cache curl \
  && curl https://fishshell.com/files/2.7.0/fish-2.7.0.tar.gz \
  | tar xz \
  && rm -rf /fish-2.7.0
  1.  Cài gói curl
  2. Dùng curl tải file fish-2.7.0.tar.gz
  3. Truyền nó qua pipe | đến lệnh tar xz để giải nén
  4. Xóa thư mục rm -rf vừa được giải nén fish-2.7.0
FROM alpine:latest
RUN apk add --no-cache curl \
  && curl https://fishshell.com/files/2.7.0/fish-2.7.0.tar.gz \
  | tar xz \
  && rm -rf /fish-2.7.0

3 layers, 5.48 Mb

Sử dụng duy nhất một lệnh run

RUN vs CMD vs ENTRYPOINT

RUN

  • Chạy khi docker build
  • Có thể tạo ra read only layer trong image
  • Dockerfile có thể chứa nhiều RUN
  • Để tối ưu nên gộp lại thành 1 lệnh

CMD

  • Chạy khi docker run
  • Chỉ tác động đến writable layer của container
  • Dockerfile chỉ có 1 lệnh CMD
  • 1  CMD có thể gộp nhiều lệnh nhỏ
  • CMD có thể bị thay thế (overwrite) khi chạy docker run

CMD

  • Chạy khi docker run
  • Có thể overwrite hoàn toàn bằng lệnh khác, nhưng không thể customize tham số

ENTRYPOINT

  • Chạy khi docker run
  • Không thể overwrite bằng lệnh mới, mà chỉ customize, thêm tham số
FROM alpine:latest
ENTRYPOINT ["ls"]

docker run chỉ được phép bổ xung tham số cho lệnh ls

FROM alpine:latest
CMD ["ls"]

docker run có thể thay thế bằng lệnh mới hoàn toàn như top

CMD  có thể dùng với ENTRYPOINT

ENTRYPOINT ["/usr/local/bin/caddy"]
CMD ["--conf", "/etc/Caddyfile"]

Luôn chạy /usr/local/bin/caddy, với mặc định là --conf /etc/Caddyfile
tuy nhiên khi docker run có thể thay đổi --conf /foo/Caddyfile

ENTRYPOINT ["/usr/local/bin/caddy"]
CMD ["--conf", "/etc/Caddyfile"]
ENTRYPOINT /usr/local/bin/caddy
CMD --conf, /etc/Caddyfile

Cách viết này tốt, giúp docker dễ parse

Cách viết này dễ khiến docker nhầm lẫn, parse lâu hơn

DockerFileExplain

By Trinh Minh Cuong

DockerFileExplain

  • 2,268