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
- Cài gói curl
- Dùng curl tải file fish-2.7.0.tar.gz
- Truyền nó qua pipe | đến lệnh tar xz để giải nén
- 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