Je suis en train de configurer le fichier docker-compose.yml et je veux lancer une stack php qui contient élastique, redis, symfony, compositeur. Maintenant, le problème que j’ai est, je ne sais pas comment utiliser compositeur avec docker car certaines fonctionnalités de compositeur doivent avoir php et une extension. Je ne veux pas construire une nouvelle image et installer nginx et php et composer et l’extension de php dessus, je ne veux pas tous les avoir en image disparate, ce que j’ai essayé jusqu’ici c’est:
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 les dépendances.
Si vous regardez composer/composer:php7
Dockerfile
, vous verrez qu’il est basé sur php:7.0-alpine
et 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.
Ainsi, puisque vous faites le mappage de votre projet dans les trois conteneurs, l’exécution de l’ composer install
dans un conteneur doit permettre aux modifications d’être visibles dans les trois conteneurs.
Moi personnellement, je ne vois pas l’intérêt de séparer PHP et nginx dans 2 conteneurs différents, car l’un est très fiable sur un autre. Et mapper votre application dans les deux conteneurs est également un exemple parfait de non-sens. C’est pourquoi je maintiens ma propre version publique de l’image nginx + php Docker. Vous pouvez le vérifier ici . Il y a plus de builds avec plus de saveurs. Et ils viennent tous avec compositeur à l’intérieur.
J’ai configuré mon fichier docker-compose.yml
pour qu’une instance de docker utilise l’image de composer/composer
et exécute une composer install
dans un conteneur partagé. Toutes les autres images pourront alors accéder au répertoire du fournisseur créé par le compositeur. La partie la plus délicate consistait à réaliser que l’image du composer/composer
supposait que le fichier composer.json
serait dans un répertoire /app
. J’ai dû remplacer ce comportement en spécifiant mon conteneur partagé comme 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 certificatee - "./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 de répertoires:
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