2016-05-03 13 views
9

Tôi có một Dockerfile cố gắng để đóng gói và triển khai một ứng dụng web vào một container. Mã ứng dụng tìm nạp từ kho lưu trữ git trong quá trình xây dựng hình ảnh Docker. Dưới đây là ảnh chụp Dockerfile:Làm thế nào để ngăn chặn Dockerfile bộ nhớ đệm git clone

........ 
RUN git clone --depth=1 git-repository-url $GIT_HOME/ 
RUN mvn package -Dmaven.test.skip 
........ 

Tôi muốn Docker không cache bước RUN git clone --depth=1 git-repository-url $GIT_HOME/ sao cho on-đi cập nhật trên kho lưu trữ có thể được phản ánh về việc xây dựng hình ảnh Docker. Có thể đạt được điều đó không?

Trả lời

8

Issue 1996 là chưa có sẵn, nhưng bạn có following workaround:

FROM foo 
ARG CACHE_DATE=2016-01-01 
RUN git clone ... 

docker build --build-arg CACHE_DATE=$(date) .... 

Điều đó sẽ làm mất hiệu lực bộ nhớ cache sau dòng ARG CACHE_DATE cho mỗi xây dựng.

+0

Cám ơn lời khuyên của bạn. Nhưng nó không hoạt động đối với tôi khi tôi sử dụng một đám mây CaaS để xây dựng hình ảnh Docker. Không có cách nào để vượt qua đối số docker. – Raindy

+0

không hoạt động đối với tôi. Phiên bản Docker 17.05.0-ce, xây dựng 89658be –

+0

@StephanRichter và https://github.com/moby/moby/pull/10682#issuecomment-178794901? – VonC

15

Một workaround:

Nếu bạn sử dụng github (hoặc gitlab hoặc bitbucket quá nhiều khả năng), bạn có thể ADD đại diện API github của repo của bạn đến một vị trí giả.

ADD https://api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json 
    RUN git clone -b$BRANCH https://github.com/$USER/$REPO.git $GIT_HOME/ 

Cuộc gọi api sẽ trả về các kết quả khác nhau khi đầu thay đổi, bộ nhớ cache của docker bị vô hiệu.

Nếu bạn đang làm việc với các hợp đồng mua tin bạn có thể sử dụng github's x-oauth-basic authentication scheme với một personal access token như vậy:

ADD https://$ACCESS_TOKEN:[email protected]/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json 

(thx @captnolimar cho một biên tập đề nghị làm rõ xác thực)

2

Nếu bạn sử dụng github bạn có thể sử dụng github API để không cache lệnh RUN cụ thể. Bạn cần phải có JQ cài đặt để phân tích cú pháp JSON: apt-get install -y JQ

Ví dụ:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName . 

Trong Dockerfile (ARG lệnh nên ngay trước RUN):

ARG SHA=LATEST 
RUN SHA=${SHA} \ 
    git clone https://github.com/Tencent/mars.git 

hoặc nếu bạn không muốn cài đặt jq

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1) 

Nếu kho lưu trữ có cam kết mới, hãy bấm vào nút git clon e sẽ được thực hiện.

0

Đối với các hợp đồng mua tin github, bạn cũng có thể vượt qua trong tên truy cập và mật khẩu của bạn:

RUN git clone -b$BRANCH https://$USER:[email protected]/$USER/$REPO.git $GIT_HOME/

+0

Câu trả lời của bạn yêu cầu định dạng bit – Billa

+0

Tôi không muốn chuyển mật khẩu người dùng của mình nếu tôi cho phép quản trị viên của tôi sao chép chỉ một repo. – Kangur

Các vấn đề liên quan