web-dev-qa-db-fra.com

comment utiliser composer avec docker-compose

Je suis en train de configurer le fichier docker-compose.yml et je veux lancer une pile php contenant élastique, redis, symfony, composer. avec docker car certaines fonctionnalités du compositeur nécessitent PHP et une certaine extension. Je ne veux pas construire une nouvelle image et installer nginx et php, et composer et étendre php dessus, je ne voudrais pas tous les avoir dans une image disparate, Ce que j'ai essayé jusqu'à présent, c'est ça :

version : '2'

services:
  nginx:
    image: tutum/nginx
    ports:
        - "80:80"
    volumes:        
        - ./nginx/default:/etc/nginx/sites-available/default
        - ./nginx/default:/etc/nginx/sites-enabled/default
        - ./logs/nginx-error.log:/var/log/nginx/error.log
        - ./logs/nginx-access.log:/var/log/nginx/access.log
        - ./app:/usr/share/nginx/html

  phpfpm:
      image: php:fpm
      ports:
          - 9000:9000
      volumes:      
          - ./app:/usr/share/nginx/html

  composer:
      image: composer/composer:php7
      command: install
      volumes: 
        - ./app:/app

  elastic2.4.4:
    image: elasticsearch:2.4.4    
    ports:
      - 9200:9200
    volumes:
      - ./esdata1:/usr/share/elasticsearch/data

  redis:
    image: redis:3.2
    ports:
      - 6379:6379

mais cela n'installe pas de dépendances.

3
joe gates

Si vous regardez composer/composer:php7Dockerfile, vous verrez alors qu'il est basé sur php:7.0-Alpine et qu'il ne semble pas que fpm soit inclus. Vous pouvez donc utiliser composer/composer:php7 comme image de base pour installer php-fpm par dessus.

Par conséquent, puisque vous mappez votre projet dans les trois conteneurs, exécuter composer install dans un conteneur devrait permettre aux modifications d'être visibles dans les trois conteneurs.

Personnellement, je ne vois pas l'intérêt de séparer PHP et nginx dans deux conteneurs différents, car l'un d'eux est très fiable. Et mapper votre application dans les deux conteneurs est également un parfait exemple de non-sens. C'est pourquoi je maintiens ma propre version publique de l'image Docker nginx + php. Vous pouvez le vérifier ici . Il y a plus de versions avec plus de saveurs. Et ils viennent tous avec le compositeur à l'intérieur.

2
Alex Karshin

J'ai configuré mon fichier docker-compose.yml afin qu'une instance de docker utilise l'image composer/composer et exécute composer install dans un conteneur partagé. Toutes les autres images pourraient alors accéder au répertoire de fournisseurs créé par le compositeur. La difficulté réside dans le fait que l’image composer/composer suppose que le fichier composer.json sera dans un répertoire /app. Je devais remplacer ce comportement en spécifiant mon conteneur partagé en tant que working_dir à la place:

version: '3'

services:
  #=====================#
  # nginx proxy service #
  #=====================#
  nginx_proxy:
    image: nginx:Alpine
    networks:
      - test_network
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # self-signed testing wildcard ssl certificate
      - "./certs:/certs"
      # proxy needs access to static files
      - "./site1/public:/site1/public"
      - "./site2/public:/site2/public"
      # proxy needs nginx configuration files
      - "./site1/site1.test.conf:/etc/nginx/conf.d/site1.test.conf"
      - "./site2/site2.test.conf:/etc/nginx/conf.d/site2.test.conf"
    container_name: nginx_proxy

  #===============#
  # composer.test #
  #===============#
  composer.test:
    image: composer/composer
    networks:
      - test_network
    ports:
      - "9001:9000"
    volumes:
      - "./composer:/composer"
    container_name: composer.test
    working_dir: /composer
    command: install

  #============#
  # site1.test #
  #============#
  site1.test:
    build: ./site1
    networks:
      - test_network
    ports:
      - "9002:9000"
    environment:
      - "VIRTUAL_Host=site1.test"
    volumes:
      - "./composer:/composer"
      - "./site1:/site1"
    container_name: site1.test

  #============#
  # site2.test #
  #============#
  site2.test:
    build: ./site2
    networks:
      - test_network
    ports:
      - "9003:9000"
    environment:
      - "VIRTUAL_Host=site2.test"
    volumes:
      - "./composer:/composer"
      - "./site2:/site2"
    container_name: site2.test

# networks
networks:
  test_network:

Voici à quoi ressemble la structure du répertoire:

certs
    test.crt
    test.key
composer
    composer.json
site1
    app
    public
    Dockerfile
    site1.test.conf
site2
    app
    public
    Dockerfile
    site2.test.conf
docker-compose.yml
1
hanmari