2015-01-13 20 views
8

Tôi đang chạy docker trên CircleCI và tôi đang gặp sự cố khi lưu vào bộ nhớ cache lệnh COPY.Dịch vụ Docker Circle CI không cache COPY

Tài liệu CI vòng kết nối đề cập đến known caching issues và khuyên bạn nên sử dụng this perl script để đặt dấu thời gian trên tệp được sao chép để giữ bộ nhớ cache.

Tình trạng Docker best practice docs:

Trong trường hợp của các hướng dẫn ADD và COPY, các nội dung của tập tin (s) khi đưa vào hình ảnh được kiểm tra. Cụ thể, kiểm tra được thực hiện của (các) tệp và sau đó kiểm tra được sử dụng trong khi tra cứu bộ nhớ cache .

Theo đề xuất của CircleCi, tôi lưu bộ nhớ cache vào đĩa rồi tải lại vào lần chạy thử tiếp theo. Điều này có vẻ là làm việc như các lệnh trước khi bộ nhớ cache COPY chính xác.

Để gỡ lỗi, tôi sẽ xuất tổng kiểm tra md5 của tệp mà tôi đang cố gắng sao chép cục bộ, sau đó từ vùng chứa docker và nó khớp chính xác. Vì vậy, trong lý thuyết bộ nhớ cache nên tải. Tôi không chắc chắn Docker sử dụng md5 như một tổng kiểm tra.

này được circle.yml của tôi hiện tại:

máy: dịch vụ: - Docker

dependencies: 
    cache_directories: 
    - "~/docker" 
    pre: 
    - mkdir -p ~/docker 
    override: 
    - docker info 
    - if [[ -e ~/docker/image.tar ]]; then docker load -i ~/docker/image.tar; fi 
    - docker images 
    - docker build -t circles . 

checkout: 
    post: 
    - ls -l 
    - ./timestamp-set-to-git.pl 
    - ls -l 

test: 
    override: 
    - md5sum .bowerrc 
    - docker run circles md5sum .bowerrc 
    - docker save circles > ~/docker/image.tar 

Đây là những gì xây dựng đầu ra cho các bước kiểm tra:

$md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

$docker run circles md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

Nhưng số docker build báo cáo điều này:

Step 6 : RUN sudo npm install -g phantomjs gulp 
---> Using cache 
---> a7bbf2b17977 
Step 7 : COPY .bowerrc /var/work/.bowerrc 
---> 7ad82336de64 

Có ai biết tại sao COPY không lưu trong bộ nhớ đệm không?

+0

Hi Rimian, tôi nhấn cùng một vấn đề và tìm kiếm giải pháp. Khi tôi xây dựng container Docker của tôi tôi muốn sao chép các tập tin từ repro GIT của tôi bên trong container với lệnh COPY. Đôi khi nó làm việc, đôi khi không. Hãy cho tôi biết khi bạn tìm thấy giải pháp. – skroll

+0

Các bước trước khi COPY được lưu vào bộ nhớ cache bởi docker, vì nó chỉ thực hiện băm trên chuỗi sau RUN

Trả lời

0

Tôi đã gặp phải vấn đề tương tự khi sử dụng drone.io (một công cụ CI khác).

Lý do tại sao điều này xảy ra là 'git clone' sẽ (ghi đè) tất cả các tệp cục bộ, sau đó sẽ nhận được dấu thời gian của thời gian sao chép đó. Vì Docker lấy hàm băm của tất cả các tệp được thêm vào trong lệnh COPY hoặc ADD, hàm băm này giờ khác với băm trước đó. Docker sau đó vô hiệu hóa bộ nhớ cache và làm lại bước đó và những bước sau.

3

Trình kết nối sử dụng TARSUM để quyết định có sử dụng Cache hay không và điều này bao gồm siêu dữ liệu tệp. Thời gian sửa đổi quan trọng nhất ... chạy một bản sao git sẽ buộc nó phải xây dựng lại từ đầu.

Để làm việc xung quanh này, tôi sử dụng một Makefile với mục tiêu sau đây ...

build: hack-touch 
    docker build -t MYTAG . 
hack-touch: 
    @echo "Reset timestamps on git working directory files..." 
    find conf | xargs touch -t 200001010000.00 
    touch -t 200001010000.00 Gruntfile.js bower.json package.json .bowerrc 

(Trong trường hợp của tôi, tất cả mọi thứ mà tôi muốn được lưu trữ như file requirements.txt là trong conf trừ các Gruntfile thứ trên dòng thứ hai. Không có mã nguồn thực sự của tôi tôi muốn được lưu trữ)

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