Docker에서 이름이 지정된 최신 태그를 만드는 방법은 무엇입니까?


241

태그를 지정하려는 이미지가 있다고 가정합니다 0.10.24(제 경우에는 Node.js 0.10.24를 포함하는 이미지입니다). Dockerfile을 docker build사용하고 -t매개 변수를 사용하여 태그를 제공 하여 해당 이미지를 작성했습니다 .

언젠가 해당 이미지의 추가 버전이있을 것으로 예상되므로 다른 태그 이름으로 프로세스를 다시 실행할 것입니다.

여태까지는 그런대로 잘됐다. 이것은 훌륭하고 훌륭하게 작동하며 모든 것이 잘됩니다.

그러나 이것이 문제가 시작되는 곳이며 항상 최신 이미지 태그 광고를 latest추가 하고 싶습니다 . 따라서 동일한 이미지에 두 개의 이름을 지정해야한다고 생각합니다.

어떻게해야합니까? docker build정확히 동일한 버전에서 다시 다시 실행해야 합니까?하지만 이번에는 다른 태그를 사용하십시오. 더 나은 옵션이 있습니까?


답변:



161

이미지가 있으면 사용할 수 있습니다

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. creack / node : latest로 이미지를 빌드하고 태그를 지정하십시오.

    $ ID=$(docker build -q -t creack/node .)
    
  2. 새 태그 추가

    $ docker tag $ID creack/node:0.10.24
    
  3. 이것을 사용하고 빌드에서 -t 부분을 건너 뛸 수 있습니다.

    $ docker tag $ID creack/node:latest
    

4
더 이상 작동하지 않는 것 같습니까? 빌드 명령은 이미지 ID를 반환하지 않습니다. ID는 전체 빌드 로그를 포함합니다
Nicolas Mommaerts

14
빌드 로그는 stderr에 있어야하며 github에서 버그 보고서를 열 수 있습니다. 그렇지 않으면, -t로 빌드 할 때 주어진 태그를 직접 사용하여 이미지 ID를 모두 버릴 수 있습니다. 내 예에서 첫 번째 줄은 이미지를 생성 한 creack/node:latest다음 태그를 지정할 수 있습니다.docker tag creack/node:latest creack/node:0.10.24
creack

이것은 다음과 같은 것들과 잘 작동합니다REV=$(hg identify --num)
analytik

2
최신 태그가 제대로 작동하게하려면 최신 태그 docker tag -f $ID creack/node:latest를 강제로 적용하기를 원할 것입니다 (이전 이미지가 이미 최신 인 경우)
treaz

4
ID = $ (docker build -q -t myrepo / myname : mytag)를 사용하십시오. "-q"는 ID 만 stdout에 기록됨을 의미합니다. 이전 브랜치를 구축하더라도 '최신'태그가 사용되지 않는 것처럼 항상 태그를 지정해야합니다.
David Roussel 2013

44

여기 내 bash 스크립트가 있습니다.

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

그런 다음 동일한 버전을 다시 빌드하면 태그가없는 이미지를 제거 할 수 있습니다

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

링크

또는

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

또는

정리 명령 :

Docker 1.13에는 정리 명령이 도입되었습니다. 사용하지 않는 모든 컨테이너, 이미지, 네트워크 및 볼륨을 제거하려면

docker system prune

또는 개별적으로 :

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

내 컴퓨터 (우분투 14.04)에서 awk '{print $3}'작동하지만 awk "{print $3}"그렇게 작동하지는 않습니다.docker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
grim

1
-f더 이상 옵션이 없습니다 docker tag. 사용법은 :docker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack

@ 2Fast2BCn : docker push이후에도 필요하다고 가정하면 또는로 docker build & docker run푸시 합니까? :latest${VERSION}
Idan Adar

당신은 내가 추측 두 가지를 밀어 수 있습니다. 어쨌든 한 번만 저장합니다.
2Fast2BCn

19

ID=$(docker build -t creack/node .)ID빌드의 출력이 포함되므로 나에게는 효과가 없습니다 .

그래서 나는이 작은 BASH 스크립트를 사용하고 있습니다 :

#!/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
아니면 그냥 통과 할 수 -q/ --quietbuild에서 언급 한 바와 같이 이 답변
driftcatcher

8

다음 에서 IDgrep하십시오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

임시 파일이 필요 없으며 전체 빌드 출력을 제공 합니다 . 여전히 /dev/null또는 로그 파일로 리디렉션 할 수 있습니다 .


5

아론의 대답의 변형. 임시 파일없이 sed 사용

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.