web-dev-qa-db-fra.com

docker-compose: comment voir les changements de fichiers instantanément (lors du développement)

Je suis nouveau sur docker, donc cela peut vous sembler très basique de toute façon - ça me fait peur en ce moment.

J'ai décidé de développer un nouveau projet web sur des conteneurs, bien sûr j'ai pensé à docker. Après avoir terminé le didacticiel et lu quelques Dockerfiles et ainsi de suite, j'ai décidé de choisir Docker-compose.

Je veux avoir plusieurs fichiers de composition, un pour le développement, un pour la production, etc. Maintenant, j'ai réussi à orchestrer une application de base php/mysql/redis en utilisant 3 services différents. L'application principale est basée sur php et maintenue dans le projet src. Mysql et Redis sont simplement configurés avec des images de base et ne nécessitent aucune logique métier.

Je peux construire les conteneurs et les monter avec

construire:

docker-compose -f compose-Development.yml build

en haut:

docker-compose -f compose-Development.yml up

De nombreux fichiers dans le conteneur principal de l'application sont créés par gulp (modèles, css, etc.) et le code existera à la fois en javascript et en php.

J'ai remarqué que l'état de mon application ne change pas lorsque je modifie mes fichiers. Je devrais reconstruire et redémarrer mes conteneurs.

Ayant une certaine expérience avec Vagrant, j'irais pour une sorte de source partagée pendant le développement. Mais comment pourrais-je y parvenir?

Mon application Dockerfile (pour le développement) ressemble à ceci:

FROM webdevops/php-nginx:7.1
COPY ./ /app
COPY docker/etc/ /opt/docker/etc

# php config...
RUN ln -sf /opt/docker/etc/php/php.Development.ini /opt/docker/etc/php/php.ini

WORKDIR /app/
EXPOSE 80

Le fichier de composition:

version: "3"
services:

  app:
    build:
      context: .
      dockerfile: Dockerfile.Development
    links:
      - mysql
      - redis
    volumes:
      - ./data/fileadmin:/app/public/fileadmin
      - ./data/uploads:/app/public/uploads
    env_file:
      - docker/env/All.yml
      - docker/env/Development.yml
    ports:
      - "80:80"
    restart: always

  # Mysql Container
  mysql:
    build:
      context: docker/mysql/
      dockerfile: Dockerfile
    restart: always
    volumes:
      - mysql:/var/lib/mysql
    env_file:
      - docker/env/All.yml
      - docker/env/Development.yml

  # Cache Backend Container
  redis:
    build:
      context: docker/redis/
      dockerfile: Dockerfile
    ports:
      - "6379:6379"
    volumes:
      - redis:/data
    env_file:
      - docker/env/All.yml
      - docker/env/Development.yml
    restart: always

volumes:
  mysql:
  redis:

Jusqu'à présent, j'ai utilisé certains référentiels github pour copier des morceaux. Je sais qu'il pourrait également y avoir d'autres problèmes dans ma configuration, pour l'instant le problème le plus bloquant est la chose avec la source liée/copiée.

Cordialement, Philipp

11
Philipp Wrann

L'idée de "parité développement/production" en déroute beaucoup sur ce front. Cela ne signifie pas que vous pouvez simplement avoir une seule configuration et cela fonctionnera sur tout; cela signifie que vous aurez une parité beaucoup plus proche et que vous pouvez créer un environnement qui ressemble à quelque chose de très proche de ce que vous aurez en production.

Ce qui ne va pas ici, c'est que vous construisez actuellement votre image et qu'elle serait prête à être expédiée, elle aurait votre code, vous avez des volumes réservés pour les téléchargements, etc. Génial!

Malheureusement, cette configuration n'est pas correcte pour le développement. Si vous souhaitez modifier le code à la volée, vous devez également attacher votre répertoire de travail local à l'image en tant que volume. Ce serait pas être fait en production; c'est donc très proche - mais pas exactement la même configuration.

Ajoutez ce qui suit dans la section app volumes de service de votre fichier de composition et vous devriez être prêt à continuer:

- .:/app
13
TJ Biddle