web-dev-qa-db-de.com

wie man composer mit docker-compose verwendet

Ich konfiguriere die docker-compose.yml-Datei und möchte einen PHP-Stack ausführen, der elastische, redis, symfony, composer. Enthält. Das Problem, das ich habe, ist, dass ich nicht weiß, wie ich composer verwenden kann mit Docker, weil einige Funktionen von Composer PHP und einige Erweiterungen benötigen. Ich möchte kein neues Image erstellen und Nginx und PHP sowie den Composer und die Erweiterung von PHP darauf installieren. Ich möchte nicht, dass alle Bilder in unterschiedlichen Images vorliegen, Was ich bisher versucht habe :

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

dies installiert jedoch keine Abhängigkeiten.

3
joe gates

Wenn Sie sich composer/composer:php7Dockerfile anschauen, werden Sie feststellen, dass es auf php:7.0-Alpine basiert, und es scheint nicht, als wäre fpm enthalten. Sie könnten also composer/composer:php7 als Basis-Image verwenden, um php-fpm darüber zu installieren.

Da Sie also das Mapping Ihres Projekts in allen drei Containern durchführen, sollten Sie composer install in einem Container ausführen, damit die Änderungen in allen drei Containern sichtbar werden.

Ich persönlich sehe keinen Punkt darin, PHP und nginx in 2 verschiedene Container aufzuteilen, da einer von einem anderen stark abhängig ist. Das Mappen Ihrer App in beide Container ist auch ein perfektes Beispiel für Unsinn. Deshalb unterhalte ich mein eigenes öffentliches Build des nginx + php Docker-Images. Sie können es hier überprüfen. Es gibt mehr Builds mit mehr Geschmacksrichtungen. Und alle kommen mit einem Komponisten.

2
Alex Karshin

Ich habe meine docker-compose.yml-Datei so eingerichtet, dass eine Docker-Instanz das composer/composer-Image verwenden und composer install in einem gemeinsam genutzten Container ausführen würde. Alle anderen Bilder können dann auf das von Composer erstellte Herstellerverzeichnis zugreifen. Der schwierige Teil war zu erkennen, dass das composer/composer-Image davon ausgeht, dass sich die composer.json-Datei in einem /app-Verzeichnis befindet. Ich musste dieses Verhalten außer Kraft setzen, indem ich stattdessen meinen gemeinsam genutzten Container als working_dir spezifizierte:

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:

So sieht die Verzeichnisstruktur aus:

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