it-swarm.com.ru

как использовать composer с docker-compose

Я настраиваю файл docker-compose.yml и хочу запустить стек php, содержащий эластичный, redis, symfony, composer. Теперь проблема в том, что я не знаю, как я могу использовать composer с докером, потому что некоторые функции composer должны иметь php и некоторое расширение. Я не хочу создавать новый образ и устанавливать на него nginx и php и composer и ​​расширение php, я не хочу, чтобы все они были разрозненным образом, что я пробовал до сих пор: этот:

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

но это не установит зависимости.

3
joe gates

Если вы посмотрите на composer/composer:php7Dockerfile, то увидите, что он основан на php:7.0-Alpine и не похоже, что fpm включен. Таким образом, вы можете использовать composer/composer:php7 в качестве базового образа для установки php-fpm поверх него.

Таким образом, поскольку вы делаете отображение вашего проекта во всех трех контейнерах, выполнение composer install в одном контейнере должно привести к тому, что изменения будут видны во всех трех контейнерах.

Лично я не вижу смысла разделять PHP и nginx на 2 разных контейнера, потому что один сильно зависит от другого. А отображение вашего приложения в обоих контейнерах также является прекрасным примером бессмыслицы. Вот почему я поддерживаю мою собственную публичную сборку образа Dogin nginx + php. Вы можете проверить это здесь . Есть больше сборок с большим количеством вкусов. И все они приходят с композитором внутри.

2
Alex Karshin

Я настроил свой файл docker-compose.yml так, чтобы один экземпляр докера использовал изображение composer/composer и выполнял composer install в общем контейнере. Все остальные образы смогут получить доступ к каталогу поставщиков, который создал композитор. Сложно было понять, что изображение composer/composer предполагает, что файл composer.json будет находиться в каталоге /app. Мне пришлось переопределить это поведение, указав вместо этого мой общий контейнер в качестве working_dir:

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:

Вот как выглядит структура каталогов:

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