Como usar o comando docker container cp para copiar arquivos

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker container cp para copiar arquivos entre o seu sistema de arquivos local e os contêineres Docker. Esta experiência prática cobrirá cenários essenciais, incluindo a cópia de arquivos da sua máquina local para um contêiner em execução, a recuperação de arquivos de um contêiner para o seu sistema local e a utilização de capacidades de streaming para transferir dados via STDOUT e STDIN.

Através de exemplos práticos, você obterá proficiência no gerenciamento do fluxo de dados para suas aplicações em contêineres. Você aprenderá como copiar arquivos individuais, diretórios e até mesmo transmitir dados, fornecendo a flexibilidade necessária para várias tarefas de desenvolvimento e implantação.

Copiar um arquivo local para dentro de um contêiner

Nesta etapa, você aprenderá como copiar um arquivo do seu sistema de arquivos local para um contêiner Docker em execução. Esta é uma tarefa comum quando você precisa adicionar arquivos de configuração, scripts ou outros dados a um contêiner após ele ter sido iniciado.

Primeiro, vamos criar um arquivo de texto simples na sua máquina local dentro do diretório ~/project.

echo "This is a test file." > ~/project/test_file.txt

Este comando cria um arquivo chamado test_file.txt no seu diretório ~/project e escreve o texto "This is a test file." nele.

Em seguida, precisamos de um contêiner em execução para copiar o arquivo. Usaremos uma imagem ubuntu simples para este fim. Como a imagem pode não estar presente localmente, primeiro faremos o pull dela.

docker pull ubuntu:latest

Este comando baixa a versão mais recente da imagem ubuntu do Docker Hub.

Agora, vamos executar um contêiner baseado na imagem ubuntu. Vamos executá-lo em modo detached (-d) e dar-lhe um nome (my_ubuntu_container) para fácil identificação.

docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity

Este comando inicia um novo contêiner chamado my_ubuntu_container usando a imagem ubuntu:latest. O comando sleep infinity mantém o contêiner em execução indefinidamente, o que é útil para fins de demonstração.

Você pode verificar se o contêiner está em execução usando o comando docker ps.

docker ps

Você deve ver my_ubuntu_container listado na saída.

Agora, podemos copiar o test_file.txt da sua máquina local para o contêiner em execução usando o comando docker cp. A sintaxe é docker cp <local_path> <container_name>:<container_path>.

docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/

Este comando copia o arquivo ~/project/test_file.txt para o diretório /tmp/ dentro do my_ubuntu_container.

Para verificar se o arquivo foi copiado com sucesso, você pode executar um comando dentro do contêiner usando docker exec. Usaremos ls para listar os arquivos no diretório /tmp/ do contêiner.

docker exec my_ubuntu_container ls /tmp/

Você deve ver test_file.txt listado na saída, confirmando que o arquivo foi copiado com sucesso.

Finalmente, vamos limpar o contêiner que criamos.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Estes comandos param e removem o contêiner, respectivamente.

Copiar arquivos de um contêiner para o sistema de arquivos local

Nesta etapa, você aprenderá como copiar arquivos de um contêiner Docker em execução para o seu sistema de arquivos local. Isso é útil para recuperar logs, arquivos de configuração ou quaisquer outros dados gerados ou modificados dentro de um contêiner.

Primeiro, vamos garantir que temos um contêiner em execução para trabalhar. Usaremos o my_ubuntu_container da etapa anterior. Se ele não estiver em execução, inicie-o.

docker start my_ubuntu_container

Este comando inicia o contêiner chamado my_ubuntu_container.

Agora, vamos criar um arquivo dentro do contêiner que copiaremos para nossa máquina local. Usaremos docker exec para executar um comando dentro do contêiner para criar um arquivo chamado container_file.txt no diretório /root/.

docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'

Este comando executa um comando shell dentro do my_ubuntu_container para criar o arquivo /root/container_file.txt com o conteúdo especificado.

Para verificar se o arquivo foi criado dentro do contêiner, você pode usar docker exec para listar os arquivos no diretório /root/ do contêiner.

docker exec my_ubuntu_container ls /root/

Você deve ver container_file.txt listado na saída.

Agora, podemos copiar o container_file.txt do contêiner para sua máquina local usando o comando docker cp. A sintaxe para copiar de um contêiner para local é docker cp <container_name>:<container_path> <local_path>. Vamos copiá-lo para o seu diretório ~/project.

docker cp my_ubuntu_container:/root/container_file.txt ~/project/

Este comando copia o arquivo /root/container_file.txt do my_ubuntu_container para o seu diretório local ~/project/.

Para verificar se o arquivo foi copiado com sucesso para sua máquina local, liste os arquivos no seu diretório ~/project.

ls ~/project/

Você deve ver container_file.txt listado na saída, junto com test_file.txt da etapa anterior.

Você também pode visualizar o conteúdo do arquivo copiado usando o comando cat.

cat ~/project/container_file.txt

A saída deve ser "This file is from the container.", confirmando que o conteúdo foi copiado corretamente.

Finalmente, vamos limpar o contêiner.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Transmitir um arquivo de um contêiner para STDOUT

Nesta etapa, você aprenderá como transmitir o conteúdo de um arquivo de um contêiner Docker em execução diretamente para a saída padrão (STDOUT) da sua máquina local. Isso é útil para visualizar rapidamente o conteúdo de um arquivo dentro de um contêiner sem copiá-lo explicitamente.

Primeiro, certifique-se de que o my_ubuntu_container está em execução. Caso contrário, inicie-o.

docker start my_ubuntu_container

Agora, vamos criar outro arquivo dentro do contêiner que transmitiremos para STDOUT. Criaremos um arquivo chamado stream_test.log no diretório /var/log/ do contêiner.

docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'

Este comando executa um comando shell dentro do my_ubuntu_container para criar o arquivo /var/log/stream_test.log com o conteúdo especificado.

Para transmitir o conteúdo deste arquivo para seu STDOUT local, você pode usar o comando docker exec com o comando cat dentro do contêiner.

docker exec my_ubuntu_container cat /var/log/stream_test.log

Este comando executa o comando cat /var/log/stream_test.log dentro do my_ubuntu_container. A saída deste comando dentro do contêiner é então transmitida para o STDOUT do seu terminal local.

Você deve ver o conteúdo "This is a log entry." impresso diretamente no seu terminal. Isso demonstra como você pode visualizar rapidamente o conteúdo de um arquivo dentro de um contêiner sem precisar copiar o arquivo inteiro.

Finalmente, vamos limpar o contêiner.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Transmitir um arquivo tar local para um contêiner via STDIN

Nesta etapa, você aprenderá como transmitir um arquivo tar local diretamente para um contêiner Docker em execução usando a entrada padrão (STDIN). Esta é uma maneira eficiente de transferir vários arquivos ou diretórios para um contêiner sem criar arquivos intermediários em sua máquina local.

Primeiro, vamos criar um diretório e alguns arquivos em sua máquina local dentro do diretório ~/project que arquivaremos e transmitiremos.

mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt

Isso cria um diretório my_files e dois arquivos de texto dentro dele.

Agora, certifique-se de que o my_ubuntu_container está em execução. Caso contrário, inicie-o.

docker start my_ubuntu_container

Para transmitir um arquivo tar para o contêiner, usaremos o comando tar para criar um arquivo do diretório my_files e canalizar (|) sua saída para o comando docker exec. Dentro do contêiner, usaremos o comando tar novamente para extrair o arquivo.

Transmitiremos o arquivo para o diretório /opt/ dentro do contêiner.

tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/

Vamos detalhar este comando:

  • tar -cvf - ~/project/my_files: Este comando cria um arquivo tar (-c) verbosemente (-v) do diretório ~/project/my_files. A opção -f - diz ao tar para escrever o arquivo para a saída padrão.
  • |: Isso canaliza a saída padrão do comando tar (o arquivo tar) para a entrada padrão do próximo comando.
  • docker exec -i my_ubuntu_container tar -xvf - -C /opt/: Isso executa o comando tar dentro do my_ubuntu_container. A flag -i é crucial, pois mantém o STDIN aberto para o comando exec, permitindo que ele receba os dados canalizados. O comando tar -xvf - extrai (-x) verbosemente (-v) da entrada padrão (-f -). A opção -C /opt/ altera o diretório para /opt/ antes de extrair, para que o conteúdo do arquivo seja extraído em /opt/my_files dentro do contêiner.

Para verificar se os arquivos foram transmitidos e extraídos com sucesso dentro do contêiner, liste o conteúdo do diretório /opt/my_files/ dentro do contêiner usando docker exec.

docker exec my_ubuntu_container ls /opt/my_files/

Você deve ver file1.txt e file2.txt listados na saída, confirmando que o arquivo tar foi transmitido e extraído corretamente.

Finalmente, vamos limpar o contêiner e os arquivos locais.

docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files

Resumo

Neste laboratório, você aprendeu como usar o comando docker container cp para copiar arquivos entre seu sistema de arquivos local e um contêiner Docker em execução. Você praticou a cópia de um arquivo local para dentro de um contêiner, demonstrando como adicionar dados ou configurações necessárias após o contêiner ser iniciado. Isso envolveu a criação de um arquivo local, a obtenção e execução de um contêiner Ubuntu simples e, em seguida, o uso de docker cp para transferir o arquivo para o diretório /tmp do contêiner.