Giữ Dockerfile bằng mã nguồn. Chúng tôi sử dụng nhãn để thêm thông tin phiên bản vào hình ảnh được tạo. Chúng tôi thêm:
- các git commit và chi nhánh
- cho dù đó là "bẩn", có nghĩa rằng những thay đổi đã được thực hiện cục bộ trên đoạn code src từ những gì trong git
- một số phiên bản CI (hiển thị công khai)
- người đã xây dựng hình ảnh (không phải người cuối cùng đã kiểm tra git)
Chúng tôi cũng gắn thẻ hình ảnh có số cam kết.
Đây là mã của chúng tôi cho một trong các dịch vụ của chúng tôi. Chúng tôi đang sử dụng Buildkite cho CI của chúng tôi và Quay.io để đăng ký hình ảnh của chúng tôi.
build-image.sh
echo '===> Building docker image...'
GIT_BRANCH=$(git name-rev --name-only HEAD | sed "s/~.*//")
GIT_COMMIT=$(git rev-parse HEAD)
GIT_COMMIT_SHORT=$(echo $GIT_COMMIT | head -c 8)
GIT_DIRTY='false'
BUILD_CREATOR=$(git config user.email)
BUILD_NUMBER="${BUILDKITE_BUILD_NUMBER-0}"
# Whether the repo has uncommitted changes
if [[ $(git status -s) ]]; then
GIT_DIRTY='true'
fi
docker build \
-q \
-t quay.io/myco/servicename:latest \
-t quay.io/myco/servicename:"$GIT_COMMIT_SHORT" \
--build-arg GIT_BRANCH="$GIT_BRANCH" \
--build-arg GIT_COMMIT="$GIT_COMMIT" \
--build-arg GIT_DIRTY="$GIT_DIRTY" \
--build-arg BUILD_CREATOR="$BUILD_CREATOR" \
--build-arg BUILD_NUMBER="$BUILD_NUMBER" \
.
echo "Done"
echo "Push to quay using:"
echo " docker push quay.io/myco/servicename:latest"
echo " docker push quay.io/myco/servicename:$GIT_COMMIT_SHORT"
Dockerfile
FROM ...
ARG GIT_COMMIT
ARG GIT_BRANCH=master
ARG GIT_DIRTY=undefined
ARG BUILD_CREATOR
ARG BUILD_NUMBER
LABEL branch=$GIT_BRANCH \
commit=$GIT_COMMIT \
dirty=$GIT_DIRTY \
build-creator=$BUILD_CREATOR \
build-number=$BUILD_NUMBER
... etc
Sau đó, bạn có thể làm cho kịch bản kiểm tra phiên bản của hình ảnh của bạn. Ví dụ:
docker inspect --format "{{.ContainerConfig.Labels.commit}}" imageid
Bản thân Dockerfile có thể được xử lý giống như một makefile. Vì vậy, giữ nó ở nơi bạn sẽ giữ những người. Đó có lẽ là Lựa chọn 1. Hay bạn đang nói về hình ảnh docker được tạo bằng cách chạy Dockerfile? – Thilo