Copiar imagens entre repositórios

Use a ferramenta gcrane para copiar imagens entre os repositórios do Docker no Artifact Registry.

Também é possível usar a ferramenta para copiar imagens do Container Registry para o Artifact Registry.

Antes de começar

Verifique os seguintes requisitos:

  1. Você criou o repositório de destino do Docker no Artifact Registry para as imagens que está copiando.

  2. Você tem as permissões necessárias:

    • Leitor do Artifact Registry (roles/storage.objectViewer) ou um papel com permissões equivalentes para o repositório de onde você está copiando.

    • Gravador do Artifact Registry (roles/artifactregistry.writer) ou um papel com permissões equivalentes para o repositório de destino.

Informações gerais

A ferramenta gcrane simplifica a cópia em repositórios com suporte para:

  • copiar conjuntos de imagens com um único comando, incluindo todas as imagens em um caminho especificado ou todas as imagens armazenadas em um host multirregional no seu projeto;
  • Pulando camadas de imagens que já foram enviadas.

Como remover imagens não usadas

Remover imagens não utilizadas antes de executar uma operação de cópia pode ajudar a reduzir os custos de armazenamento.

Há várias ferramentas disponíveis para identificar e automatizar a remoção de imagens que você não precisa mais. Por exemplo, a ferramenta gcr-cleaner ajuda a encontrar e remover imagens antigas com base em critérios diferentes. A ferramenta gcr-cleaner não é um produto oficial do Google.

Para mais informações sobre como configurar e usar a ferramenta, consulte a documentação do gcr-cleaner.

Como configurar o gcrane

É possível executar gcrane a partir de vários ambientes:

  • Instância do Compute Engine: use esta opção se você tiver um número maior de contêineres para copiar.

    Custos: tempo de atividade da instância da VM do Compute Engine. Se a instância de VM estiver em um local diferente do repositório de origem, cobranças de saída de rede poderão ser aplicadas às imagens que você copiar.

  • Cloud Shell: uma opção para copiar pequenos conjuntos de cerca de 40 GB ou menos. Como a ferramenta gcrane ignora o upload de camadas de imagem que já foram enviadas, esse limite se aplica aos novos dados que você está copiando.

    Copiar repositórios maiores pode fazer com que o Cloud Shell se desconecte após o período de tempo limite da solicitação de 10 minutos.

    Custos: se a instância do Cloud Shell estiver em um local diferente do repositório de origem, as cobranças de saída de rede poderão ser aplicadas às imagens copiadas. Não é possível escolher o local de uma sessão do Cloud Shell. Para verificar o local da sessão atual, execute o comando:

    curl metadata/computeMetadata/v1/instance/zone
    

Recomendamos o uso da versão mais recente da ferramenta gcrane para aproveitar todos os recursos e melhorias disponíveis. As instruções de configuração nas seções a seguir incluem etapas para fazer o download da versão mais recente.

Para verificar a versão de uma instalação do gcrane existente, execute o comando:

gcrane version

Como configurar o Compute Engine

Para copiar imagens com gcrane de uma instância de VM do Compute Engine:

  1. Crie uma instância de VM. Para minimizar os custos, crie a instância no mesmo local do registro de onde você está copiando.
  2. Por padrão, a instância de VM está associada à conta de serviço padrão e tem permissões para extrair imagens. Altere o escopo de acesso para que a instância de VM possa enviar imagens.

    1. Pare a instância de VM. Consulte Como interromper uma instância.

    2. Altere o escopo de acesso com o comando a seguir:

      gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
      

      Substitua INSTANCE pelo nome da instância de VM.

    3. Reinicie a instância de VM. Consulte Como iniciar uma instância interrompida.

  3. Conecte-se à instância de VM usando SSH.

  4. Execute o seguinte comando para fazer o download de gcrane.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  5. Execute os seguintes comandos para tornar o comando gcrane executável.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  6. Execute o comando gcrane --help para verificar a instalação.

Agora você já pode copiar imagens. Para continuar:

Como configurar o Cloud Shell

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Defina o projeto padrão. Substitua PROJECT pelo ID do projeto em que o Container Registry e o Artifact Registry estão instalados.

    gcloud config set project PROJECT.
    
  3. Execute este comando para fazer o download da ferramenta gcrane.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  4. Execute os seguintes comandos para tornar o comando gcrane executável.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  5. Execute o comando gcrane --help para verificar a instalação.

Agora você já pode copiar imagens. Para continuar:

Como configurar uma máquina local

  1. Faça o download do gcrane no repositório do GitHub. Por exemplo, o comando a seguir faz o download da distribuição do Linux x86-64 pela linha de comando.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  2. Execute os seguintes comandos para tornar o comando gcrane executável. Os comandos presumem que o arquivo salvo é chamado de go-containerregistry.tar.gz.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  3. Execute o comando gcrane --help para verificar a instalação.

Agora você já pode copiar imagens. Para continuar:

Identificar imagens a serem copiadas

Depois de instalar a ferramenta gcrane, é possível listar as imagens existentes no repositório de origem para encontrar as que você quer copiar.

Para listar as imagens atuais, execute o comando:

gcrane ls LOCATION-docker.pkg.dev/PROJECT/REPOSITORY

Para listar as tags de uma imagem, execute o comando:

gcrane ls LOCATION-docker.pkg.dev/PROJECT/IMAGE

Para listar as imagens recursivamente em um caminho específico, execute o comando:

gcrane ls -r LOCATION-docker.pkg.dev/PROJECT/PATH

Para cada um dos comandos:

  • Substitua LOCATION pelo local do repositório.
  • Substitua PROJECT pelo ID do projeto.
  • Substitua PATH pelo caminho a ser copiado.

Veja os comandos para copiar suas imagens em Como copiar imagens.

Como copiar imagens

É possível copiar imagens individuais ou conjuntos de imagens com o comando gcrane cp.

Para copiar uma única imagem, execute o comando:

gcrane cp LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1/IMAGE1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2/IMAGE2

Para copiar imagens recursivamente em um caminho específico de um repositório, execute o comando:

gcrane cp -r LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1/IMAGE1/PATH1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2/IMAGE2/PATH2

Para copiar todas as imagens em um repositório, execute o comando:

gcrane cp -r LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2

Substitua os seguintes valores:

  • LOCATION1 é o local do repositório de origem.
  • LOCATION2 é o local do repositório de destino.
  • PROJECT1 é o ID do projeto do Google Cloud associado ao repositório de origem.
  • PROJECT2 é o ID do projeto do Google Cloud associado ao repositório de destino.
  • REPOSITORY1 é o nome do repositório de origem.
  • REPOSITORY2 é o nome do repositório de destino.
  • IMAGE1 é a imagem que você quer copiar.
  • IMAGE2 é o nome da imagem no repositório de destino.

Examples

O comando a seguir copia my-image:tag1 do repositório repo1 para o repositório repo2 no mesmo projeto e região.

gcrane cp us-east1-docker.pkg.dev/my-project/repo1/my-image:tag1 \
us-east1-docker.pkg.dev/my-project/repo2/my-image:tag1

O comando a seguir copia de maneira recursiva todas as imagens em test-images/testing no repositório repo1 para o mesmo caminho no repositório repo2.

gcrane cp -r us-east1-docker.pkg.dev/my-project/repo1/test-images/testing \
us-east1-docker.pkg.dev/my-project/repo2/test-images/testing

O comando a seguir copia todas as imagens do repositório my-repo no projeto dev-project para o repositório my-repo em outro projeto chamado prod-project.

gcrane cp -r us-east1-docker.pkg.dev/dev-project/my-repo \
us-east1-docker.pkg.dev/prod-project/my-repo