La installation de Composer no instala packages cuando se ejecuta en Dockerfile

Parece que no puedo ejecutar la installation del compositor en Dockerfile pero puedo hacerlo en el contenedor después de comstackr una image y ejecutar el contenedor.

Aquí está el command de Dockerfile:

RUN composer require drupal/video_embed_field:1.5 RUN composer install --no-autoloader --no-scripts --no-progress 

El resultado es:

 Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Nothing to install or update 

Pero después de ejecutar el contenedor con Docker-Componer:

 ... drupal: image: docker_image container_name: container ports: - 8081:80 volumes: - ./container/modules:/var/www/html/web/modules links: # Link the DB container: - db 

running docker exec composer install instalará los packages correctamente:

 Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 1 installs, 0 updates, 0 removals ... Generating autoload files 

Supongo que los files composer.json y composer.lock son correctos porque puedo ejecutar el command de installation del compositor en el contenedor sin ningún esfuerzo adicional, pero solo después de que el contenedor se esté ejecutando.

Se intentó actualizar Combinando los commands del compositor con:

 RUN composer require drupal/video_embed_field:1.5 && composer install 

Mismo problema, "Nada que instalar o actualizar". En última instancia, me gustaría continuar usando sentencias RUN separadas en Dockerfile para aprovechar el almacenamiento en caching de Docker.

Su problema proviene del hecho de que, docker-compose tiene la intención de orquestar la construcción de varios contenedores acoplables y ejecutar al mismo time y de alguna manera realmente no muestra lo que hace detrás de la escena a las personas que comienzan con acoplado.

Detrás de un docker-compose up hay cuatro pasos:

  • docker-compose build si es necesario, y si todavía no hay imágenes existentes, cree las imágenes
  • docker-compose create si es necesario, y si aún no hay contenedor (s) existente, crea el / los contenedor (es)
  • docker-compose start start contenedor (s) existente (s)
  • docker-compose logs loggings stderr y stdout de los contenedores

Entonces, lo que tiene que detectar allí, es el hecho de que la acción contenida en su Dockerfile se ejecuta en el paso de creación de la image.
Al montar carpetas se ejecuta al inicio del paso contenedores.

Por lo tanto, cuando intenta usar un command RUN , parte del paso de creación de la image, en files como composer.lock y composer.json que están montados en el paso de inicio, termina teniendo nada que instalar a través del compositor porque sus files no están montados en ningún lado todavía.

Si hace una COPY de esos files que realmente pueden llegar a algún lado, porque entonces tendrá los files del compositor como parte de su image.

Dicho esto, tenga cuidado de que la carpeta de origen montada anule por completo el punto de assembly para que pueda esperar una carpeta de proveedor y no tenerla.
Lo que idealmente debe hacer es tenerlo como ENTRYPOINT , este ocurre en el último paso del arranque del contenedor.

Aquí hay una pequeña comparación en desarrollo: una image de acoplador es para un contenedor acoplable lo que una class es para una instancia de una class: un object.
Su contenedor está creado a partir de imágenes creadas posiblemente mucho time antes.
La mayoría de los pasos en su Dockerfile ocurren en la creación de la image y no en el momento del inicio del contenedor.
Si bien la mayoría de las instrucciones de docker-compose están destinadas a la automation de la compilation del contenedor, que incluyen el assembly de carpetas.