Estoy dando mis primeros pasos en Docker, así que intenté crear un Dockerfile que crea un index.html simple y un directorio de imágenes (ver el código a continuación)
Luego ejecuto docker-compose build para crear la imagen y docker-compose-up para ejecutar el servidor. Pero no obtengo ningún archivo index.html o imágenes de carpeta.
Este es mi Dockerfile:
FROM php:apache MAINTAINER brent@dropsolid.com WORKDIR /var/www/html RUN touch index.html \ && mkdir imagesY este es mi docker-compose.yml
version: '2' services: web: build: .docker/web ports: - "80:80" volumes: - ./docroot:/var/www/htmlEsperaría que esto creara una carpeta docroot con un directorio de imágenes y un index.html, pero solo obtengo el docroot.
El Dockerfile contiene instrucciones sobre cómo crear una imagen. La imagen que creaste a partir de ese Dockerfile contiene index.html e images/ .
En tiempo de ejecución, creó un contenedor a partir de la imagen que creó. En ese contenedor, montó el directorio externo ./docroot como /var/www/html .
Un montaje ocultará lo que haya antes en esa ruta, por lo que este montaje ocultará el contenido anterior de /var/www/html , reemplazándolo con lo que esté en ./docroot .
En los comentarios que preguntaste
¿Existe la posibilidad de montar primero y luego crear archivos o algo así? ¿O es eso imposible?
De la forma en que ha hecho las cosas, los montó sobre sus archivos originales, por lo que ya no son accesibles una vez que se crea el contenedor.
Hay un par de formas en las que puedes manejar esto.
Si coloca estos archivos en una ruta diferente en su imagen, el montaje no los sobrescribirá.
WORKDIR /var/www/alternate-html RUN touch index.html \ && mkdir images WORKDIR /var/www/html Ahora, en tiempo de ejecución todavía tendrá este montaje en /var/www/html , que contendrá el contenido del directorio externo. Que puede o no ser un directorio vacío. Puede decirle al contenedor al inicio que ejecute un script y copie las cosas allí, si eso es lo que desea.
COPY entrypoint.sh /entrypoint.sh RUN chmod 0755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"](Esto supone que no tiene un punto de entrada definido; si lo tiene, tal vez solo necesite ajustar su script existente).
punto de entrada.sh:
#!/bin/sh cp -r /var/www/alternate-html/* /var/www/html exec "$@" Esto ejecutará el comando cp y luego entregará el control a cualquiera que sea el CMD para esta imagen.
También tiene la opción de simplemente completar previamente los archivos que desea en ./docroot externamente. Luego estarán allí cuando el contenedor se inicie y agregue el montaje del directorio.