Dockerfile là chìa khóa để xây dựng image Docker hiệu quả. Bài viết này cung cấp hướng dẫn toàn diện về các lệnh thường dùng trong Dockerfile, kèm theo ví dụ minh họa, giúp bạn tạo ra những image Docker tối ưu và tinh gọn.
1. FROM
Để bắt đầu, hãy tìm hiểu lệnh FROM, luôn là lệnh đầu tiên trong Dockerfile. Lệnh này xác định image cơ sở cho image Docker của bạn.
FROM ubuntu:latest
VD: FROM python:3.9
dành cho các dự án dựa trên Python.
2. WORKDIR
Tiếp theo là lệnh WORKDIR thiết lập thư mục làm việc bên trong container.
WORKDIR /app
Đảm bảo các lệnh tiếp theo (như COPY hoặc RUN) hoạt động trong thư mục này.
3. COPY
Lệnh COPY sao chép file hoặc thư mục từ ngữ cảnh build vào container.
COPY src/ /app/
Nó đơn giản và nhanh hơn ADD khi không cần giải nén hoặc tải xuống từ URL.
4. ADD
Ngược lại, 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, mang lại sự linh hoạt trong việc quản lý tài nguyên.
ADD myfile.tar.gz /app/
5. RUN
Lệnh RUN thực thi các lệnh trong quá trình build, chẳng hạn như cài đặt phần mềm.
RUN apt-get update && apt-get install -y curl
Mỗi lệnh RUN tạo ra một layer image mới. Kết hợp các lệnh với && giúp giảm thiểu số lượng layer, tối ưu kích thước image.
6. CMD
CMD chỉ định lệnh mặc định khi container khởi động, có thể bị ghi đè khi chạy docker run <image> <command>
CMD ["python", "app.py"]
7. ENTRYPOINT
Lệnh ENTRYPOINT xác định ứng dụng hoặc lệnh chính để chạy trong container, thường dùng cho container hoạt động như file thực thi.
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Nó kết hợp với CMD để cung cấp các đối số mặc định.
8. ENV
ENV thiết lập biến môi trường, có thể được truy cập bên trong container, hữu ích cho việc cấu hình ứng dụng.
ENV NODE_ENV=production
9. EXPOSE
Lệnh EXPOSE khai báo cổng mà container đang listen on, nhưng không publish cổng, bạn cần dùng -p trong docker run
EXPOSE 8080
10. LABEL
LABEL thêm metadata vào image, dùng cho mô tả, phiên bản hoặc thông tin người bảo trì.
LABEL maintainer="you@example.com"
11. ARG
ARG định nghĩa biến thời gian build, được truyền trong quá trình build bằng docker build --build-arg APP_VERSION=2.0
ARG APP_VERSION=1.0
12. 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. USER
USER chỉ định người dùng để chạy các tiến trình container, tăng cường bảo mật bằng cách tránh quyền root.
USER appuser
14. SHELL
SHELL thay đổi shell được sử dụng trong các lệnh RUN, cho phép tùy chỉnh môi trường build.
SHELL ["/bin/bash", "-c"]
15. ONBUILD
ONBUILD thiết lập trigger cho các image phụ thuộc, chỉ thực thi khi image được dùng làm base cho Dockerfile khác.
ONBUILD RUN apt-get update
Tóm lại
Để xây dựng Dockerfile hiệu quả, hãy áp dụng các best practice:
- Sử dụng Multi-Stage Builds để giảm kích thước image,
- Tối thiểu hóa layer bằng cách kết hợp lệnh trong RUN,
- Tận dụng .dockerignore để loại trừ file không cần thiết,
- Sử dụng tag cho base image thay vì latest để đảm bảo tính nhất quán.
Ví dụ về Dockerfile hoàn chỉnh
# Use Python as the base image
FROM python:3.9 # Set environment variables
ENV APP_HOME=/app # Set the working directory
WORKDIR $APP_HOME # Copy application files
COPY . $APP_HOME # Install dependencies
RUN pip install -r requirements.txt # Expose the port
EXPOSE 5000 # Run the application
CMD ["python", "app.py"]
Hy vọng bài viết này hữu ích đối với các bạn!