Como Copiar Arquivos com Docker cp para seu Contêiner 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 começar!

Pré-requisitos

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

  • O 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 comando docker cp. 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.

Vamos aprender como usar o comando Docker cp com um exemplo.

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 seguinte docker run 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 seguintes parâmetros no comando, da seguinte forma:

  • Usando o arquivo ou a – Copia todas as permissões de usuário e grupo primário dos arquivos e pastas.
  • Usando 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 do Docker  
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Sintaxe para Copiar do Host do 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 copiará o myfile.txt que você criou anteriormente para o diretório /usr/share dos contêineres. ccae4670f030 é o ID do contêiner para o qual o myfile.txt será copiado.

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

6. Por fim, faça login SSH no contêiner em execução executando o comando docker exec com /bin/bash, que é usado como 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 interativamente.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

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

SSH into the running container using docker exec command

7. Depois de fazer login no contêiner, verifique se o myfile.txt foi copiado para o contêiner usando o comando ls.

  • O comando ls é usado para listar arquivos de computador em sistemas operacionais Unix e similares ao Unix.
  • O comando grep irá procurar por todos os arquivos ou pastas que começam 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 só vez? Certamente, executar múltiplos comandos se torna uma sobrecarga! Para resolver o problema de executar 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 poderia 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, em seguida, mude (cd) o diretório de trabalho para essa pasta. Esta pasta conterá todos os arquivos que você irá criar nesta demonstração.

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 o conteúdo neles 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 concluído, o Docker usará este DockerFile para executar todos os comandos necessários para construir uma nova imagem Docker em cima de qualquer imagem base.

O DockerFile abaixo contém várias etapas/instruções que irão construir o novo contêiner:

  • FROM A instrução FROM inicializa uma nova etapa de compilação e define a Imagem Base para instruções subsequentes.
  • COPY O comando COPY copia um arquivo da máquina host (host Docker) para o contêiner.
# 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 o myfile1.txt para o diretório /usr/share do contêiner
COPY myfile1.txt /usr/share
# Copiando o myfile2.txt para o diretório /tmp do contêiner
COPY myfile2.txt /tmp

4. Verifique todos os arquivos necessários para construir a nova imagem executando o comando tree. Você deverá 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 updated_ubuntu_image com a versão latest e . permite que o Docker pegue 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 imagem recém-criada updated_ubuntu_image executando o comando docker images. Observe o atributo REPOSITORY. Este atributo é a marca 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.

Assumindo que você ainda está 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

4. 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. Depois de executar o comando docker inspect, ele exibirá todos os detalhes do contêiner especificado (detalhes volume_testing), incluindo os detalhes de montagem, como mostrado abaixo.

sudo docker inspect volume_testing

Abaixo, a imagem confirma que o volume (my-vol) que você criou no host está montado com sucesso com o 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 do Docker para contêineres, como usar o comando Docker cp, comandos de volume do Docker e Dockerfile.

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

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