Copiar arquivos para um contêiner com Docker Compose


100

Eu tenho um Dockerfileonde copio um diretório existente (com conteúdo) para o contêiner que funciona bem:

Dockerfile

FROM php:7.0-apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

Captura de tela da lista de diretórios com docker exec

Mas quando eu uso um docker-compose.ymlarquivo só existe o diretório aw3somevideoe dentro aw3somevideonão há nada.

docker-compose.yml :

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

Captura de tela da lista de diretórios vazia

Talvez eu não entenda a função do volumese, se for o caso, diga-me como copiar meus arquivos existentes para o contêiner por meio de um docker-compose.ymlarquivo.


5
Remova sua volumes:seção do arquivo docker-compose. Sua imagem já contém os dados. A seção volumes: apenas substitui os dados. Mude também para o formato docker-compose atual (versão 2).
Bernard

@Alkaline thx esse realmente era o problema. Mas por que os volumes não copiam todo o diretório?
TheDoctor

Vou responder como uma resposta para que você feche este problema.
Bernard

Respostas:


89

Dado

    volumes:
      - /dir/on/host:/var/www/html

se /dir/on/hostnão existir, ele é criado no host e o conteúdo vazio é montado no contêiner em /var/www/html. Qualquer conteúdo que você tinha antes /var/www/htmldentro do contêiner fica inacessível, até que você desmonte o volume; a nova montagem está escondendo o conteúdo antigo.


É possível que, com as versões recentes do docker, o conteúdo de var/www/html/não seja mais copiado, /dir/on/hostmesmo quando não existe? Existe uma maneira de forçar a cópia dos dados de dentro do docker-container para o host ao iniciar um container pela primeira vez?
Tarator

1
@Tarator sim, o lado direito não é mais copiado para o host. Vou atualizar a resposta. Quanto a uma maneira de copiar no início do contêiner, você pode substituir o comando de inicialização por algo assim docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". Não se esqueça de usar execpara invocar o comando final para que seja atribuído PID1. Isso garantirá que myapp receba sinais de encerramento (Ctrl-C por exemplo).
Bernard

Olá, também estou tentando fazer a mesma coisa com docker-compose, mas obtendo um erro, você pode dar uma olhada nisso ... stackoverflow.com/questions/45573831/…
utkarsh31

Ei, Bernard, em sua resposta você se refere a " se o lado direito especifica um volume nomeado como myvolume ou um caminho no host" . Você não quis dizer "mão esquerda", já que é onde se designa um volume ou caminho de host, que é então mapeado para a localização do contêiner no rhs? Sei que você está falando sobre como o Docker pode gerenciar a cópia de arquivos entre a esquerda e a direita e como isso mudou.
charlie arehart

@charliearehart Você está certo. Vou consertar esse erro agora.
Bernard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.