Vì ARG và mọi lệnh RUN đều được ghi vào metadata của image.
Ai có image cũng đọc lại được:
bash
docker history --no-trunc my-image # shows the full RUN command with the token
docker inspect my-image # build args appear in the configXoá ở layer sau cũng vô ích: layer là bất biến và cộng dồn, file đã nằm ở layer trước thì vẫn tồn tại trong image.
Cách đúng là BuildKit secret mount — secret chỉ tồn tại trong lúc chạy RUN, không ghi vào layer nào:
dockerfile
# syntax=docker/dockerfile:1
RUN --mount=type=secret,id=npmtoken \
NPM_TOKEN=$(cat /run/secrets/npmtoken) npm cibash
docker build --secret id=npmtoken,env=NPM_TOKEN .Còn secret runtime (DB password, API key) thì không bao giờ nhét vào image: truyền qua biến môi trường lúc docker run/Compose, hoặc lấy từ secret manager (Vault, AWS Secrets Manager, Kubernetes Secret).
Image phải chạy được ở mọi môi trường mà không chứa cấu hình của môi trường nào.