initContainer là một khái niệm rất hữu ích trong Kubernetes và Argo Workflows. Dưới đây là giải thích đơn giản và các ví dụ để bạn dễ dàng áp dụng.
initContainer là gì?
Hãy coi initContainer như những bước chuẩn bị phải chạy và hoàn thành thành công trước khi container chính (main container) của bạn được khởi động. Chúng rất lý tưởng cho các tác vụ như :
- Chuẩn bị môi trường: Cài đặt thư viện, dependencies (giống như
npm installtrong ví dụ của bạn). - Chờ đợi dịch vụ khác: Đảm bảo một database hoặc một API đã sẵn sàng trước khi ứng dụng chính kết nối.
- Tải dữ liệu: Sao chép mã nguồn từ Git hoặc tải các file cấu hình cần thiết.
Ví dụ về initContainer đơn giản
Đây là một ví dụ cơ bản để minh họa cách initContainer và container chính tương tác với nhau qua một volume dùng chung (emptyDir).
initContainer: Sẽ tạo một filemessage.txttrong volume.container: Sẽ đọc nội dung của file đó và in ra log.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: init-container-simple-
spec:
entrypoint: main-template
# Khai báo một volume dùng chung, sẽ tồn tại trong suốt vòng đời của Pod
volumes:
- name: workdir
emptyDir: {}
templates:
- name: main-template
# Gắn volume đã khai báo vào template này
volumeMounts:
- name: workdir
mountPath: /shared-workdir
# Init container sẽ chạy trước
initContainers:
- name: setup-phase
image: alpine:latest
command: ["/bin/sh", "-c"]
args:
- |
echo "Xin chào từ init container!" > /shared-workdir/message.txt
echo "Đã chuẩn bị xong."
# Container chính, chỉ chạy khi initContainer ở trên đã hoàn thành
container:
name: main-phase
image: alpine:latest
command: ["/bin/sh", "-c"]
args:
- |
echo "Bắt đầu container chính..."
sleep 1
# Đọc file do initContainer tạo ra
cat /shared-workdir/message.txt
echo "Container chính đã hoàn thành."
Ví dụ này cho thấy rõ chuỗi tuần tự: setup-phase chạy trước để chuẩn bị dữ liệu, và main-phase chạy sau để sử dụng dữ liệu đó .