Como Copiar Arquivos com Docker cp para seu Container Docker

Se você precisa copiar arquivos do host Docker para o seu contêiner Docker, este tutorial é para você.

Neste tutorial, você aprenderá a copiar arquivos do host Docker para um contêiner Docker usando várias abordagens.

Vamos lá!

Pré-requisitos

Se você deseja seguir passo a passo, certifique-se de ter o seguinte:

  • Docker instalado no host Linux. Este tutorial usa o Docker v19.03.11. Você pode confirmar a versão do seu Docker executando docker version.

Copiando Arquivos com o Comando docker cp

Para começar este tutorial, você aprenderá a copiar arquivos do host Docker para os contêineres usando o docker cp comando. O comando docker cp copia arquivos ou pastas entre um contêiner e o sistema de arquivos local do seu host Docker e vice-versa.

1. Abra um terminal em sua máquina local.

2. Crie um arquivo chamado myfile.txt usando o comando touch. O arquivo myfile.txt será copiado do host Docker para o contêiner.

touch myfile.txt

3. Execute o comando docker run. O docker run abaixo criará um novo contêiner em segundo plano. O comando abaixo contém três parâmetros descritos a seguir:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx será a imagem usada para executar o contêiner.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. Verifique se o contêiner Docker foi criado com sucesso usando o comando docker ps. Após executar o comando docker ps, você deverá ver um novo valor gerado sob o atributo CONTAINER ID (neste caso, ccae4670f030) usando a imagem NGINX, confirmando que o contêiner foi criado com sucesso.

sudo docker ps
Verifying the docker container by running the docker ps command

Antes de executar o comando Docker cp, a sintaxe do comando Docker cp é:

  • CONTAINER: SRC_PATH especifica o caminho de origem do contêiner.
  • DEST_PATH é o caminho de destino no host.
  • CONTAINER: DEST_PATH é o caminho de destino no contêiner.

Além disso, você também pode adicionar as opções com os parâmetros abaixo no comando, da seguinte forma:

  • Usar o arquivo ou a – Copia todas as permissões de usuário e grupo primário dos arquivos e pastas.
  • Usar L – Especificar a opção L permitirá que qualquer link simbólico no Caminho de Origem seja copiado para o caminho de destino.
# Sintaxe para Copiar do Contêiner para o Host Docker  
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Sintaxe para Copiar do Host Docker para o Contêiner  
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. Em seguida, execute o comando docker cp. O comando docker cp irá copiar o myfile.txt que você criou anteriormente para o diretório /usr/share dos containers. ccae4670f030 é o ID do container para o qual o myfile.txt será copiado.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. Por fim, SSH no contêiner em execução executando o comando docker exec com /bin/bash, que é usado como o shell padrão para login de usuário do sistema Linux.

  • A flag i indica que você deseja abrir uma sessão SSH interativa para o contêiner. A flag i não fecha a sessão SSH mesmo se o contêiner não estiver anexado.
  • A flag t aloca um pseudo-TTY que deve ser usado para executar comandos de forma interativa.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

Você verá abaixo que agora está conectado ao shell do contêiner quando executar docker exec.

SSH into the running container using docker exec command

7. Após fazer login no contêiner, verifique se o arquivo myfile.txt foi copiado para o contêiner usando o comando ls.

  • ls é um comando para listar arquivos de computador em sistemas operacionais Unix e Unix-like.
  • grep irá procurar por todos os arquivos ou pastas, começando com a string my dentro do diretório usr/share.
Verifying the files in the container

Copiando Arquivos usando DockerFile

Na seção anterior, você aprendeu como copiar os arquivos para o contêiner executando o comando Docker cp. E se você precisar copiar vários arquivos de uma vez? Certamente, executar vários comandos se torna uma sobrecarga! Para resolver a execução de vários comandos cp, por que não tentar copiar arquivos ou pastas para contêineres usando Dockerfile com comandos COPY?

Implantar um contêiner e copiar os arquivos/pastas usando Dockerfile permite remover as etapas de cópia manual que você fez na seção anterior. Um Dockerfile é um documento de texto que contém todos os comandos que um usuário pode chamar na linha de comando para montar uma imagem.

Vamos criar um Dockerfile, executar um contêiner a partir dele e finalmente copiar os arquivos.

1. Crie uma pasta chamada ~/host-to-container-copy-demo, então mude (cd) o diretório de trabalho para essa pasta. Esta pasta conterá todos os arquivos que você criará neste demo.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. Agora, crie dois arquivos de texto chamados myfile1.txt e myfile2.txt, copie e cole-os nos arquivos e salve-os no diretório ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. Crie outro arquivo, copie/cole a configuração abaixo e salve o arquivo como Dockerfile dentro do diretório ~/host-to-container-copy-demo. Quando completo, o Docker usará este DockerFile para executar todos os comandos necessários para construir uma nova imagem do Docker em cima de qualquer imagem base.

O DockerFile abaixo contém vários passos/instruções que construirão o novo container:

  • FROM A instrução FROM inicializa uma nova etapa de construção e define a Imagem Base para instruções subsequentes.
  • COPY O comando COPY copia um arquivo da máquina host (host do Docker) para o container.
# Instrução para o Dockerfile criar uma nova imagem em cima da imagem base (ubuntu)
# Usando a imagem base ubuntu: latest
FROM ubuntu:latest
# Copiando myfile1.txt para o diretório /usr/share do container
COPY myfile1.txt /usr/share
# Copiando myfile2.txt para o diretório /tmp do container
COPY myfile2.txt /tmp

4. Verifique todos os arquivos necessários para construir a nova imagem executando o comando tree. Você deve ver Dockerfile, myfile1.txt e myfile2.txt no diretório ~/host-to-container-copy-demo.

Verifies files and folders using tree command

5. Em seguida, construa a imagem executando o comando docker build. A bandeira t é usada para marcar a imagem como updated_ubuntu_image com a tag latest e . permite ao Docker pegar todos os arquivos necessários do diretório de trabalho atual.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. Agora, verifique a nova imagem construída updated_ubuntu_image executando o comando docker images. Observe o atributo REPOSITORY. Este atributo é a tag criada com a bandeira -t na etapa anterior.

sudo docker images
Repository Attribute

7. Por fim, execute o contêiner Docker usando a imagem recém-criada, executando o comando docker run. A bandeira -it instrui o Docker a alocar um pseudo-terminal conectado ao stdin do contêiner. bash fornece o shell padrão para o login do usuário no sistema Linux.

sudo docker run -it updated_ubuntu_image bash

Você verá abaixo que agora está no shell Bash do contêiner Docker.

Running the container using docker run command.

8. Em seguida, verifique se os arquivos foram copiados com sucesso no contêiner nos diretórios /tmp e /usr/share executando o comando ls.

Verifying the files if they are successfully copied on the container

Montando um Volume de Armazenamento e Acessando Arquivos com o Comando Docker Volume

Até agora, você aprendeu como copiar arquivos do host para o contêiner usando duas abordagens diferentes, utilizando o comando docker cp e um DockerFile. Desta vez, vamos aprender como compartilhar facilmente sistemas de arquivos entre o host e os contêineres usando o comando docker volume.

Supondo que você ainda esteja conectado ao terminal:

1. Crie um volume no host do Docker executando o comando docker volume create. O comando abaixo criará um volume chamado my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. Verifique se o volume foi criado com sucesso executando o comando docker volume ls. O comando docker volume ls lista o volume. Após executar o comando docker volume ls, você verá my-vol no atributo NOME DO VOLUME, confirmando que o volume foi criado com sucesso.

sudo docker volume ls
Listing the docker volumes

3. Em seguida, execute o contêiner usando o comando docker run.

  • O contêiner chamado volume_testing utiliza a imagem nginx: latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

Verifique se o volume my-vol que você criou anteriormente está montado corretamente com o contêiner usando o comando docker inspect. O comando docker inspect fornece as informações do contêiner. Após executar o comando docker inspect, ele exibirá todos os detalhes do contêiner especificado (volume_testing), incluindo os detalhes de montagem, conforme mostrado abaixo.

sudo docker inspect volume_testing

Abaixo, o instantâneo da imagem confirma que o volume (my-vol) que você criou no host está montado com sucesso no diretório /app do contêiner.

Verifying the volumes in the container

Conclusão

Neste tutorial, você aprendeu diferentes maneiras de copiar arquivos ou pastas do host Docker para os contêineres, como usar o comando Docker cp, comandos de volume Docker e Dockerfile.

Então, qual abordagem você vai usar a seguir ao copiar dados do host para contêineres Docker?

Source:
https://adamtheautomator.com/docker-cp/