Làm cách nào để tạo thẻ có tên và mới nhất trong Docker?


241

Giả sử tôi có một hình ảnh mà tôi muốn gắn thẻ là 0.10.24(trong trường hợp của tôi đó là một hình ảnh có chứa Node.js 0.10.24). Tôi đã xây dựng hình ảnh đó bằng cách sử dụng Dockerfile và thực thi docker buildvà bằng cách cung cấp thẻ bằng -ttham số.

Tôi hy vọng rằng một ngày nào đó tôi sẽ có các phiên bản bổ sung của hình ảnh đó, vì vậy tôi sẽ chạy lại quy trình, chỉ với một tên thẻ khác.

Càng xa càng tốt. Điều này làm việc tuyệt vời và tốt đẹp và tất cả là tốt.

Nhưng, và đây là lúc vấn đề bắt đầu, tôi cũng muốn luôn có hình ảnh mới nhất được gắn thẻ quảng cáo latest. Vì vậy, tôi đoán rằng tôi cần phải đặt hai tên cho cùng một hình ảnh.

Làm thế nào để tôi làm điều này? Tôi có thực sự cần phải chạy lại docker buildtrên cùng một phiên bản chính xác không, nhưng lần này sử dụng một thẻ khác, liệu có lựa chọn nào tốt hơn không?


Câu trả lời:



161

Khi bạn đã có hình ảnh của mình, bạn có thể sử dụng

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Xây dựng và gắn thẻ hình ảnh với creack / nút: mới nhất

    $ ID=$(docker build -q -t creack/node .)
    
  2. Thêm một thẻ mới

    $ docker tag $ID creack/node:0.10.24
    
  3. Bạn có thể sử dụng phần này và bỏ qua phần -t từ bản dựng

    $ docker tag $ID creack/node:latest
    

4
Điều này dường như không còn hoạt động nữa? Lệnh build không trả về id hình ảnh, ID chứa toàn bộ nhật ký xây dựng
Nicolas Mommaerts

14
Nhật ký xây dựng được cho là trên stderr, bạn có thể mở một bugreport trên github. Mặt khác, khi bạn xây dựng với -t, bạn có thể sử dụng trực tiếp thẻ đã cho và loại bỏ hoàn toàn id hình ảnh. Trong ví dụ của tôi, dòng đầu tiên tạo ra một hình ảnh creack/node:latest, sau đó bạn có thể gắn thẻ nó vớidocker tag creack/node:latest creack/node:0.10.24
creack

Điều này hoạt động tốt với một cái gì đó nhưREV=$(hg identify --num)
analytik

2
Để làm cho thẻ mới nhất hoạt động chính xác, có lẽ bạn sẽ muốn thực hiện docker tag -f $ID creack/node:latestđể buộc thẻ mới nhất (trong trường hợp hình ảnh trước đó là mới nhất)
treaz

4
Sử dụng: ID = $ (docker build -q -t myrepo / myname: mytag.). "-Q" có nghĩa là chỉ ID được ghi vào thiết bị xuất chuẩn. Bạn phải luôn chỉ định một thẻ, vì nếu bạn không sử dụng thẻ 'mới nhất' sẽ được sử dụng, ngay cả khi bạn đang xây dựng một chi nhánh cũ.
David Roussel

44

Đây là kịch bản bash của tôi

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

Sau đó, bạn có thể xóa hình ảnh chưa được đánh dấu nếu bạn xây dựng lại cùng một phiên bản với

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

liên kết

hoặc là

docker rmi $(docker images | grep "^<none>" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

hoặc là

Dọn dẹp lệnh :

Docker 1.13 giới thiệu các lệnh dọn dẹp. Để xóa tất cả các container, hình ảnh, mạng và khối lượng không sử dụng:

docker system prune

hoặc cá nhân:

docker container prune
docker image prune
docker network prune
docker volume prune

Trên máy của tôi (Ubuntu 14.04) awk '{print $3}'hoạt động nhưng không phải awk "{print $3}"vậy, lệnh tôi sử dụng làdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
nghiệt ngã

1
các -ftùy chọn không còn tồn tại docker tag. Cách sử dụng chỉ làdocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack

@ 2Fast2BCn: Giả sử bạn cũng cần phải theo docker pushsau docker build & docker run, bạn có đẩy bằng :latesthay ${VERSION}không?
Idan Adar

Bạn có thể đẩy cả tôi đoán. Nó sẽ lưu trữ nó chỉ một lần nào.
2Fast2BCn

19

ID=$(docker build -t creack/node .)không làm việc cho tôi vì IDsẽ chứa đầu ra từ bản dựng.

Vì tôi đang sử dụng tập lệnh BASH nhỏ này:

#!/bin/bash

set -o pipefail

IMAGE=...your image name...
VERSION=...the version...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/java7/bin/java -version

1
Hoặc bạn chỉ có thể vượt qua -q/ --quietđến buildnhư được đề cập trong câu trả lời này
driftcatcher

8

Chỉ cần grep ID từ docker images:

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

Nhu cầu không có tập tin tạm thời và đưa ra đầy đủ xây dựng đầu ra . Bạn vẫn có thể chuyển hướng nó đến /dev/nullhoặc một tệp nhật ký.


5

Sự thay đổi câu trả lời của Aaron. Sử dụng sed mà không có tập tin tạm thời

#!/bin/bash
VERSION=1.0.0
IMAGE=company/image
ID=$(docker build  -t ${IMAGE}  .  | tail -1 | sed 's/.*Successfully built \(.*\)$/\1/')

docker tag ${ID} ${IMAGE}:${VERSION}
docker tag -f ${ID} ${IMAGE}:latest
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.