Soy muy (muy) nuevo en Docker, así que estoy experimentando. He creado un Dockerfile muy básico para extraer Laravel:

FROM composer:latest
RUN composer_version="$(composer --version)" && echo $composer_version
RUN composer global require laravel/installer
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel site

Mi archivo docker-compose.yml se ve así:

version: '3.7'

services:

    laravel:
        build:
            context: .
            dockerfile: laravel.dockerfile
        container_name: my_laravel
        network_mode: host
        restart: on-failure
        volumes:
            - ./site:/var/www/site

Cuando ejecuto docker-compose up, se crea el directorio ./site pero el contenido está vacío. Puse esto en docker-compose ya que planeo incluir otras cosas como nginx, mysql, php, etc.

El comando:

docker run -v "/where/i/want/data/site:/var/www/site" my_laravel

Da como resultado el mismo comportamiento.

Sé que la instalación se realizó correctamente ya que modifiqué mi dockerfile con las siguientes dos líneas adjuntas:

WORKDIR /var/www/site
RUN ls -la

Lo que me da la lista correcta.

Claramente malinterpretando algo aquí. Cualquier ayuda apreciada.

0
Zakalwe 28 sep. 2019 a las 20:08

1 respuesta

La mejor respuesta

EDIT: Entonces, pude hacer que esto funcionara ... aunque, fue un poco más difícil que solo especificar una ruta ...

Puede lograr esto especificando un volumen en docker-compose.yml .. La ruta al directorio (en el host) está etiquetada como device en el archivo de redacción .. Parece que la raíz de la ruta tiene que ser un volumen real (posiblemente un recurso compartido funcionaría) pero el 'destino' de la ruta puede ser un directorio en el volumen especificado.

Creé un nuevo volumen llamado docker en mi máquina, pero supongo que podrías hacer esto con tu disco / volumen existente ...

Estoy en una Mac y este archivo docker-compose.yml funcionó para mí:

version: '3.7'
services:
  nodemon-test:
    container_name: my-nodemon-test
    image: oze4/nodemon-docker-test
    ports:
      - "1337:1337"
    volumes:
      - docker_test_app:/app    # see comment below on which name to use here

volumes:
  docker_test_app:              # use this name under `volumes:` for the service
    name: docker_test_app
    driver: local
    driver_opts:
       o: bind
       type: none
       device: /Volumes/docker/docker_test_app

El contenedor especificado existe en mi DockerHub .. este es el código fuente, solo en caso de que esté preocupado por algo malicioso. Lo creé hace dos semanas para ayudar a alguien más en StackOverflow.


Muestra archivos del contenedor en mi máquina (el host) ..

enter image description here


Puede leer más sobre las configuraciones de volumen de Docker aquí si gustaría.


RESPUESTA ORIGINAL:

Parece que está intentando compartir el directorio de compilación con su máquina host. Después de algunas pruebas, parece que Docker sobrescribirá la ruta especificada en el contenedor con el contenido de la ruta en el host.

Si ejecuta docker logs my_laravel, debería ver un error sobre archivos faltantes en /var/www/site. Entonces, aunque la compilación sea exitosa, una vez que Docker monte el directorio de su máquina (./site) en el contenedor (/var/www/site) sobrescribe la ruta dentro del contenedor (/var/www/site) con el contenido de la ruta en su host (./site) - que está vacío.

Para probar y asegurarse de que el contenido de /var/www/site de hecho se sobrescriba, puede ejecutar docker exec -it /bin/bash (es posible que deba reemplazar /bin/bash con /bash). Esto le dará Usted accede a la línea de comandos dentro del contenedor. Desde allí puedes hacer ls -a /var/www/site ...

Además, también puede preparar previamente ./site para tener un archivo de prueba aleatorio en él (test.txt o lo que sea), luego docker-compose up -d, luego ejecute los mismos comandos del paso anterior {{X3 }} y vea si el archivo test.txt en etapas está ahora dentro del contenedor; esto le brinda evidencia definitiva de que cuando ejecuta volumes, los datos en su host sobrescriben los datos en el contenedor.

Dicho esto, hacer algo como esto y compartir un directorio de registro funcionará ... la ruta del volumen especificada en el contenedor aún se sobrescribe, la la diferencia es que el contenedor está escribiendo en esa ruta ... no depende de él para los archivos de configuración / archivos de aplicaciones.

Espero que esto ayude.

1
Matt Oestreich 29 sep. 2019 a las 19:59