Tối Ưu Hóa Docker Image: Hướng Dẫn Về Các Lệnh Trong Dockerfile
Dockerfile là tài liệu quan trọng giúp bạn xây dựng image Docker một cách hiệu quả. Bài viết này cung cấp hướng dẫn chi tiết về các lệnh cơ bản thường được sử dụng trong Dockerfile, cùng với các ví dụ cụ thể, cho phép bạn tạo ra những image Docker tối ưu và nhẹ nhàng hơn.
1. Lệnh FROM
Lệnh FROM luôn là lệnh đầu tiên trong Dockerfile. Nó xác định image cơ sở mà bạn muốn sử dụng để xây dựng image Docker của mình. Ví dụ:
FROM ubuntu:latest
Nếu bạn đang làm việc với Python, có thể sử dụng:
FROM python:3.9
2. Lệnh WORKDIR
Lệnh WORKDIR giúp bạn thiết lập thư mục làm việc bên trong container, đảm bảo rằng các lệnh sau (như COPY hoặc RUN) được thực hiện trong thư mục này.
WORKDIR /app
3. Lệnh COPY
Lệnh COPY dùng để sao chép file hoặc thư mục từ ngữ cảnh build vào trong container một cách nhanh chóng và đơn giản.
COPY src/ /app/
Hãy sử dụng COPY thay vì ADD khi không cần tải từ URL hoặc giải nén file.
4. Lệnh ADD
Khác với COPY, lệnh ADD có khả năng tải xuống tài nguyên từ xa và tự động giải nén các file nén như .tar.gz. Điều này mang lại sự linh hoạt cho bạn trong việc quản lý tài nguyên.
ADD myfile.tar.gz /app/
5. Lệnh RUN
Lệnh RUN thực thi các lệnh cần thiết trong quá trình build image, ví dụ như cài đặt phần mềm. Mỗi lệnh RUN tạo ra một layer image mới. Vì vậy, nên kết hợp các lệnh với nhau để giảm số lượng layer và tối ưu kích thước image.
RUN apt-get update && apt-get install -y curl
6. Lệnh CMD
CMD chỉ định lệnh sẽ được thực thi khi container khởi động. Nếu có bất kỳ lệnh nào được cung cấp khi chạy docker run <image> <command>
, lệnh mặc định sẽ bị ghi đè.
CMD ["python", "app.py"]
7. Lệnh ENTRYPOINT
ENTRYPOINT xác định ứng dụng hoặc lệnh chính sẽ chạy trong container. Nó thường được sử dụng khi bạn muốn container hoạt động như một file thực thi.
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Lệnh ENTRYPOINT có thể kết hợp với CMD để cung cấp các đối số mặc định.
8. Lệnh ENV
Lệnh ENV dùng để thiết lập các biến môi trường bên trong container. Điều này rất hữu ích cho việc cấu hình ứng dụng.
ENV NODE_ENV=production
9. Lệnh EXPOSE
Lệnh EXPOSE khai báo cổng mà container đang lắng nghe. Tuy nhiên, để publish cổng, bạn cần sử dụng cờ -p trong câu lệnh docker run
.
EXPOSE 8080
10. Lệnh LABEL
Lệnh LABEL cho phép bạn thêm metadata vào image, phục vụ cho việc mô tả, phiên bản hoặc thông tin người bảo trì.
LABEL maintainer="you@example.com"
11. Lệnh ARG
Lệnh ARG định nghĩa các biến có thời gian sống trong quá trình build, cho phép truy cập chúng bằng docker build --build-arg APP_VERSION=2.0
.
ARG APP_VERSION=1.0
12. Lệnh VOLUME
Lệnh VOLUME tạo điểm mount cho dữ liệu liên tục, đảm bảo thư mục tồn tại bên ngoài container.
VOLUME /data
13. Lệnh USER
USER chỉ định người dùng để chạy các quy trình trong container, gia tăng bảo mật bằng cách hạn chế quyền root.
USER appuser
14. Lệnh SHELL
Nếu bạn muốn tùy chỉnh shell sử dụng cho các lệnh RUN, hãy sử dụng lệnh SHELL.
SHELL ["/bin/bash", "-c"]
15. Lệnh ONBUILD
Cuối cùng, lệnh ONBUILD cho phép bạn thiết lập trigger cho các image phụ thuộc, chỉ thực hiện khi image này được sử dụng làm base cho một Dockerfile khác.
ONBUILD RUN apt-get update
Tóm Tắt
Để xây dựng Dockerfile hiệu quả, hãy áp dụng các best practices sau:
- Sử dụng Multi-Stage Builds để giảm kích thước image.
- Kết hợp các lệnh trong RUN nhằm tối thiểu hóa số lượng layer.
- Tận dụng file .dockerignore để loại trừ những file không cần thiết.
- Sử dụng tag cụ thể cho base image thay vì latest để đảm bảo tính nhất quán.
Ví Dụ Về Dockerfile Hoàn Chỉnh
# Sử dụng Python làm base image
FROM python:3.9
# Thiết lập biến môi trường
ENV APP_HOME=/app
# Thiết lập thư mục làm việc
WORKDIR $APP_HOME
# Sao chép file ứng dụng
COPY . $APP_HOME
# Cài đặt dependencies
RUN pip install -r requirements.txt
# Khai báo cổng
EXPOSE 5000
# Thực thi ứng dụng
CMD ["python", "app.py"]
Hy vọng bài viết này sẽ giúp ích cho bạn trong việc tối ưu hóa Docker image một cách hiệu quả và dễ dàng hơn!
source: viblo