2016-09-11 26 views
5

Chúng tôi là một vài nhà phát triển hiện đang phát triển một ứng dụng C++.Dockerfile versioning best practice

Để đảm bảo mọi người sử dụng cùng thư viện và phụ thuộc so với máy chủ sản xuất từ ​​xa, chúng tôi đang sử dụng đế trình để biên dịch mã nguồn trong máy chủ cục bộ của chúng tôi.

Câu hỏi của tôi là cách thực hành tốt nhất để sử dụng git với docker?

  1. Thêm Dockerfile vào kho mã nguồn
  2. Tạo một kho lưu trữ chuyên dụng cho tất cả chúng tôi Dockerfiles
  3. tạo một kho lưu trữ chuyên dụng cho mỗi Dockerfile
  4. người khác?
+1

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

Trả lời

10

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 
2

tôi muốn đi cho 2 hoặc 3.

tôi sẽ không giữ Dockerfile với nguồn khác nhau, vì mục đích của mỗi khác:

  • Docker và Dockerfile thường thuộc về thế giới devops, và cư xử độc lập với phần mềm thực tế. ví dụ. Docker là một cách để triển khai phần mềm của bạn, nhưng nó không phải là cách duy nhất.
  • Dockerfile của bạn có thể trong phần mềm tổng hợp trong tương lai từ một kho lưu trữ git khác - trong đó repo bạn sẽ giữ nó?
  • một sự thay đổi trong phần mềm không nên systematiaclly ảnh hưởng đến phiên bản của repo chi nhánh Dockerfile
  • một sự thay đổi trong dockerfile không nên ảnh hưởng đến phiên bản của chi nhánh phần mềm repo

Đôi khi tho Tôi có thể hiểu rằng Dockerfile được kết hợp chặt chẽ với nguồn phần mềm mà trên thực tế bạn chỉ muốn lưu trữ tất cả chúng lại với nhau vì mục đích đơn giản. Nhưng tôi không làm cho nó trở thành một tiêu chuẩn theo bất kỳ cách nào.