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.
Si vous regardez composer/composer:php7
Dockerfile
, 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.
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