1
votes

Docker: création d'une application PHP entièrement installée

Puis-je utiliser docker-compose pour créer une configuration en une étape pour une application PHP complètement installée? Puisque c'est une question assez vague. J'utiliserai WordPress comme exemple.

Si je regarde les dépôts officiels de docker wordpress a >, Je vois qu'il y a déjà un fichier yml super utile pour docker-composer

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

C'est génial et me donne un serveur d'applications frontal en cours d'exécution avec WordPress déjà là. Il obtient également un serveur de base de données. Il met en place tout pour se parler. C'est génial.

Ce que cela ne m'apporte pas, c'est un WordPress entièrement installé . Comme beaucoup d'applications PHP, pour être complètement installé, il y a quelques champs de configuration supplémentaires qui doivent être définis, et quelques champs de base de données supplémentaires.

Cela signifie Je ne peux pas installer complètement l'application tant que les conteneurs wordpress et db ne sont pas complètement ouverts. J'ai pensé à pirater une solution de contournement où j'ai le CMD ou ENTRYPOINT attendre qu'une connexion DB soit établie, mais le (s) Dockerfile (s) WordPress de base utilise déjà ENTRYPOINT et CMD donc ce n'est pas une option. (ou est-ce?)

Existe-t-il une manière élégante et simple de faire ce que je veux faire? Ou suis-je bloqué en train de dire à mes utilisateurs de docker-composer, puis d'exécuter une deuxième commande pour terminer l'installation?


1 commentaires

Voici ma configuration pour un wordpress entièrement installé à l'aide d'un script personnalisé. github.com/alhoqbani/wpdocker


4 Réponses :


1
votes

Ce que vous devrez probablement faire est de créer votre propre Dockerfile basé sur l'image Wordpress, puis de leur donner vos propres trucs à exécuter.

Je pense que quelque chose comme ça devrait fonctionner

docker-compose.yml

FROM wordpress
RUN your-own-commands

./docker/wordpress/Dockerfile

version: '3.1'

services:

  wordpress:
    build:
      context: ./docker/wordpress
    restart: always
    ports:
      - 8080:80
    depends_on:
      - "db"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'

I uniquement brièvement mis ensemble, donc il n'est pas vraiment testé, mais il devrait vous donner une idée et une direction générales


3 commentaires

Je ne suis pas sûr que cela fonctionnera pour moi. "my-own-commands" doit accéder à la base de données mysql en cours d'exécution pour INSÉRER des choses, et RUN exécute les choses lorsque le conteneur est construit pour la première fois (sauf erreur?)


que diriez-vous d'utiliser depend_on dans votre conteneur wordpress? Alors que wordpress attendrait en fait que le conteneur DB se charge complètement en premier? J'ai également édité le fichier docker-compose


Je n'étais pas familier avec depend_on! Cela semble prometteur, merci!



2
votes

S'il y a des étapes supplémentaires que vous effectuez manuellement ou via des scripts après avoir exécuté docker-compose up pour le docker-compose publié dans votre question, vous pouvez modifier l'image wordpress originale avec votre propre image dans l'ordre pour que cela fonctionne comme prévu pour les besoins de votre entreprise, tout ce que vous avez à faire est de commencer à écrire un nouveau Dockerfile qui produit une nouvelle image wordpress personnalisée. Vous pouvez donc faire ce qui suit à titre d'exemple:

FROM wordpress:5.1.0-php7.1-apache
COPY custom_docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["custom_docker-entrypoint.sh"]
CMD ["apache2-foreground"]

Le custom_docker-entrypoint.sh représente les étapes supplémentaires qui devaient être effectuées. vous pouvez également introduire de nouvelles variables d'environnement dans le script de point d'entrée afin de rendre le processus aussi dynamique que possible pour différents clients sans avoir besoin de créer une image personnalisée pour chaque client.

L'image générée peut être utilisée dans votre fichier docker-compose au lieu du fichier officiel


3 commentaires

+1 utile, merci. J'espérais qu'il y avait un moyen de le faire sans avoir besoin de connaître / comprendre le POINT D'ENTREE ou les CMD sous-jacents des images Dockerfiles de base - mais comme solution de contournement, celui-ci semble OK


Le point d'entrée et le cmd peuvent être considérés comme identiques. entrypoint est la commande principale qui sera exécutée et cmd sera considérée comme un paramètre pour elle. Cependant, vous pouvez utiliser cmd directement sans point d'entrée dans d'autres cas


Notez également que l'image mysql a la capacité de restaurer le fichier sql. donc si vous avez une base de données existante, vous pouvez la migrer facilement vers le conteneur mysql. vérifiez Initialisation d'une nouvelle instance ici: hub.docker.com/_/mysql



1
votes

Pour autant que je sache, l'image MySQL a son propre script de démarrage qui peut encore s'exécuter une fois que le conteneur est prêt. Ce script de démarrage peut être utilisé pour importer des données dans la base de données - les connexions MySQL ne seront toujours pas acceptées, mais le dossier pensera que votre base de données est prête.

Ce que cela signifie pour vous, c'est que si pour une raison quelconque le script db init s'exécute plus longtemps, il arrêtera les commandes d'installation de php de fonctionner.

Vous devrez peut-être implémenter un thread d'interrogation qui attendra le démarrage de la base de données - puis exécutez les scripts d'installation sur php.

Voici un article que j'ai trouvé qui détaille un problème similaire.

https://cweiske.de/tagebuch/docker-mysql-available.htm

Il y a peut-être d'autres astuces qui pourraient convenir à votre cas d'utilisation, mais j'aurais besoin de connaître un peu plus de contexte.

MODIFIER:

Vérifiez les bilans de santé du docker. Cela pourrait convenir à votre cas d'utilisation.

https://docs.docker.com/compose/compose-file/ #healthcheck


0 commentaires

1
votes

S'il y a des commandes que vous voulez exécuter une fois les conteneurs ouverts, il existe un moyen. Je ne sais pas si c'est la manière standard de le faire dans docker mais cela fonctionnera.

Comme vous le savez déjà, l'image wordpress a son propre ENTRYPOINT qui est le script docker-entrypoint.sh .

Donc, ce que vous pouvez faire est de mettre votre commande personnalisée dans ce script qui sera exécuté au démarrage du conteneur wordpress.

Vous pouvez le faire comme suit:

  • Démarrez votre conteneur et copiez le contenu de l'existant docker-entrypoint.sh

  • Créez un nouveau docker-entrypoint.sh en dehors du conteneur et modifiez-le script pour ajouter votre commande chmod à l'emplacement approprié.

  • Dans votre Dockerfile, ajoutez une ligne pour copier ce nouveau script de point d'entrée dans le
    emplacement /usr/local/bin/docker-entrypoint.sh

REMARQUE:

Ne mettez pas votre commande personnalisée à la fin du script docker-entrypoint.sh . Vous pouvez le mettre n'importe où avant la ligne exec "$ @" .


0 commentaires