Depuis que j'ai constaté que l'application que nous avons préparée s'est considérablement développée, j'ai décidé de trouver une méthode entièrement nouvelle pour automatiser le processus de son lancement. Il était important pour moi de trouver une solution qui permette d'activer les nouvelles fonctionnalités de manière isolée.
Introduction
La découverte d'une méthode plus simple d'automatisation des processus constituerait une amélioration significative de mon travail et de celui de l'ensemble de mon personnel. équipe. Je me suis dit "Pourquoi ne pas utiliser Docker ?"
Au cours de la phase de préparation, j'ai créé deux configurations : l'une pour l'application frontale et l'autre pour l'API. Vous trouverez ci-dessous une présentation de ce que j'ai appris au cours du processus de développement.
Le premier problème
Je veux avoir un dépôt cloné dans le conteneur, j'ai donc ajouté une clé ssh via la commande ADD dans Dockerfile :
ADD ~/.ssh/testowy
Et bam ! le fichier n'est pas trouvé. Pourquoi ?
Supposons que nous ayons la structure de dossiers suivante :
docker/
|-- stuff/
|-- test.txt
|-- Dockerfile
server/
|-- data
|-- setup.yml
Exécuter la commande construire
dans le file d'attente de connexion
et vous ne pouvez ajouter que des fichiers du dossier local et de ses sous-dossiers locaux, par exemple stuff.
Si vous souhaitez ajouter le serveur
vous recevrez un message : "Impossible de préparer le contexte"
Dockerignore
Vous êtes-vous déjà demandé pourquoi l'image met tant de temps à se construire ? Peut-être n'avez-vous pas utilisé .dockerignore
pour ignorer les fichiers qui ne sont pas nécessaires dans l'image. L'option .git
devrait être supprimé automatiquement, ainsi que tous les fichiers temporaires.
Ordre des commandes dans le fichier Docker
Docker enregistre chaque ligne dans Dockerfile et, après la construction, chaque ligne est enregistrée en tant que couche. Il est très important de ne pas changer l'ordre des commandes trop souvent.
Depuis ubuntu
Exécuter apt-get install -y software-properties-common python
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
Exécuter apt-get update
Exécuter apt-get install -y nodejs
Exécuter apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Par exemple, si vous modifiez la dernière ligne du fichier Docker, toutes les lignes précédentes seront téléchargées depuis le cache tandis que la dernière ligne sera modifiée. Si vous remplacez la ligne n° 4, toutes les lignes à partir de la ligne 4 jusqu'à la fin seront modifiées. C'est pourquoi il est préférable de placer les commandes qui ne seront pas modifiées au début du fichier.
Copie de fichiers sur l'image
Il convient de réfléchir à l'usage qui sera fait d'une image donnée. Si vous en avez besoin pour lancer un service une seule fois, il suffit de copier le fichier code directement sur l'image :
COPY . /workdir
Malheureusement, cela rend impossible l'édition de fichiers et chaque fois que vous voudrez modifier votre code, vous devrez reconstruire l'image.
Si vous utilisez MacOS et souhaitez utiliser l'image construite pour le développement, vous devez aborder la question d'une manière légèrement différente. Si vous utilisez des volumes, vous devez vous attendre à ce que cette solution soit extrêmement lente (par exemple, la copie d'un fichier de l'hôte vers le conteneur se fait à une vitesse de 4,5 Mo/s, alors que la copie interne dans le conteneur se fait à une vitesse 10 à 20 fois plus élevée). Heureusement, comme vous pouvez le voir à lienLe problème est connu et sa solution est au cœur des préoccupations de l'équipe responsable du développement de Docker pour Mac.
Comment utiliser Docker pour le développement dans cette situation ?
Vous pouvez l'utiliser pour des services externes, par exemple Redis/PSQL/Elasticsearch ou utiliser des solutions prêtes à l'emploi, qui offrent rsync : https://github.com/brikis98/docker-osx-dev
En résumé
Si vous avez une grande équipe et que vous souhaitez tester une nouvelle fonctionnalité, docker sera l'outil idéal ! Néanmoins, l'utiliserais-je pour la mise en production d'un serveur ? Je ne suis pas encore totalement convaincu...
En outre, je recommande quelques articles remarquables :