Copiar archivos a un contenedor con Docker Compose

94

Tengo un lugar Dockerfiledonde copio un directorio existente (con contenido) al contenedor que funciona bien:

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 pantalla de la lista de directorios con docker exec

Pero cuando uso un docker-compose.ymlarchivo, solo está el directorio aw3somevideoy dentro aw3somevideono hay nada.

docker-compose.yml :

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

Captura de pantalla de la lista de directorios vacía

Tal vez no entiendo la función de volumesy, si ese es el caso, dígame cómo copiar mis archivos existentes al contenedor a través de un docker-compose.ymlarchivo.

El doctor
fuente
4
Elimina tu volumes:sección de tu archivo docker-compose. Tu imagen ya tiene los datos. La sección volúmenes: simplemente sobrescribe los datos. También muévase al formato actual de docker-compose (versión 2).
Bernard
@Alkaline thx ese era realmente el problema. Pero, ¿por qué los volúmenes no copiaron todo el directorio?
TheDoctor
Te responderé como respuesta para que cierres este problema.
Bernard

Respuestas:

80

Dado

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

si /dir/on/hostno existe, se crea en el host y el contenido vacío se monta en el contenedor en /var/www/html. Cualquier contenido que tuviera antes /var/www/htmldentro del contenedor es inaccesible, hasta que desmonte el volumen; la nueva montura oculta el contenido anterior.

Bernardo
fuente
¿Es posible que con las versiones recientes de Docker el contenido de var/www/html/ya no se copie /dir/on/hostincluso cuando no existe? ¿Hay alguna forma de forzar la copia de los datos desde el contenedor de la ventana acoplable al host cuando se ataca un contenedor por primera vez?
Tarator
1
@Tarator sí, de hecho, el lado derecho ya no se copia en el host. Actualizaré la respuesta. En cuanto a una forma de copiar al inicio del contenedor, puede anular el comando de inicio con algo como esto docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". No olvide utilizar execpara invocar el comando final para que se le asigne PID1. Eso asegurará que myapp reciba señales de terminación (Ctrl-C por ejemplo).
Bernard
Hola, yo también estoy intentando lo mismo con cargador de muelle de composición del pero conseguir un error, por favor, ¿Puede usted tener una mirada en ella ... stackoverflow.com/questions/45573831/...
utkarsh31
Oye, Bernard, en tu respuesta te refieres a " si el lado derecho especifica un volumen con nombre como myvolume o una ruta en el host" . ¿No quiso decir "mano izquierda" allí, ya que ahí es donde se designa un volumen o una ruta de host, que luego se asigna a la ubicación del contenedor en la derecha? Me doy cuenta de que está hablando de cómo Docker puede administrar la copia de archivos entre la izquierda y la derecha, y cómo se modifica.
charlie arehart
@charliearehart Tienes razón. Arreglaré ese error ahora.
Bernard