Một Dockerfile có dòng WORKDIR service. Người đọc nghĩ các lệnh sau chạy ở /service, nhưng image cha có thể đã đặt thư mục làm việc khác. Khi đổi image cha, đường dẫn tương đối vẫn hợp lệ và build có thể đi tiếp, chỉ có điều file được đặt vào một vị trí mà người vận hành không dự kiến.
Xác định điểm bắt đầu
Tài liệu Dockerfile và build check WorkdirRelativePath được đối chiếu ngày 12/11/2026. Đường dẫn tương đối nối vào thư mục làm việc đang có; đường dẫn tuyệt đối đặt lại vị trí. Nếu dùng image bên ngoài, hãy chọn một đường dẫn tuyệt đối đầu tiên mà bạn kiểm soát. Phần sau có thể dùng đường dẫn tương đối có chủ đích, miễn điểm bắt đầu rõ ràng.
FROM busybox:1.37 AS base
WORKDIR /parent
FROM base AS inherited
WORKDIR service
RUN test "$(pwd)" = /parent/service
FROM base AS explicit
WORKDIR /service
RUN test "$(pwd)" = /service
Hai stage cùng lấy một base nhưng có hợp đồng đường dẫn khác nhau. Stage inherited đi xuống một cấp từ /parent, còn explicit đặt lại thành /service. Kết quả được ghi trong điều kiện test là kỳ vọng theo tài liệu; chưa build image hoặc kéo tag trong lượt biên tập. Khi dùng thật, xác minh tag và chọn digest theo chính sách của dự án.
Cách kiểm tra trên máy có Docker
Lưu vào Dockerfile trong thư mục thử, rồi build riêng từng target để cả hai điều kiện được thực thi. Khi build chỉ target cuối, các stage độc lập không cần cho target đó có thể không chạy, vì vậy không lấy một kết quả thành công làm bằng chứng cho cả hai.
docker build --target inherited -t aedev-workdir-inherited .
docker build --target explicit -t aedev-workdir-explicit .
Nếu test sai, đọc giá trị WORKDIR ở stage hiện tại và ở base trước khi đổi đường dẫn trong từng RUN. Trong repo thật, xem thêm đích COPY tương đối và đường dẫn đọc cấu hình khi chạy. Chúng có thể phụ thuộc cùng một vị trí dù phần lệnh nhìn qua không có đường dẫn tuyệt đối.
Lỗi thường gặp và cách review
Một lệnh RUN cd chỉ thay đổi thư mục trong tiến trình chạy lệnh đó. Nếu muốn các chỉ dẫn sau có chung điểm bắt đầu, khai báo WORKDIR ngay tại stage cần dùng. Đừng trông chờ thư mục trong stage không phải base của bạn truyền sang stage khác.
Dấu ngã trong WORKDIR cũng không được mở rộng theo shell như nhiều người quen dùng ở terminal. Khi đọc Dockerfile, nhìn slash đầu tiên và truy ngược base thay vì suy ra từ lệnh shell tương tự. Tách kiểm tra đường dẫn khỏi kiểm tra nội dung: đúng thư mục không chứng minh file cần thiết đã được COPY đúng.
Kết luận
Chọn đường dẫn tuyệt đối đầu tiên cho stage có hợp đồng file rõ ràng. Sau khi thay base, dùng assertion ở build thử để xác nhận vị trí, không chỉ nhìn build có báo thành công hay không.


