Il y a quelque chose que je ne reçois pas lorsque je développe une application en utilisant docker
conteneurs.
Disons que je développe une application Java et j’ai configuré un conteneur Java avec l’image de base jdk 8, il me faut toujours installer Java 8 jdk sur ma machine de développement locale, car le IDE que je vais utiliser va rechercher des bibliothèques d’exécution sur la machine locale et non le conteneur de menu fixe.
Est-ce vrai ou est-ce que je manque quelque chose? Je pourrai faire quelque chose entièrement sur le conteneur de docker, comme par exemple configurer une base de données, mais je devrai également faire certaines choses sur ma machine de développement locale et essayer de faire correspondre cette image à mon image de docker, par exemple une exécution de langage telle que Java ou python afin d’utiliser l’EDI).
Il y a quelque chose que je ne reçois pas lors du développement d'une application lors de l'utilisation de conteneurs Docker.
Ce n'est pas grave. Essayez de voir la grande image, il s'agit de créer un pipeline de développement (ou pipeline CI/CD si vous souhaitez utiliser les termes Intégration continue/Livraison continue).
L'image ci-dessus provient de [2]
Disons que je développe une application Java et que j'ai configuré un conteneur Java avec l'image de base jdk 8, il me faut toujours installer Java 8 jdk sur ma machine de développement locale. , car le IDE que je vais utiliser va rechercher des bibliothèques d’exécution sur la machine locale et non le conteneur de menu fixe.
C'est une option qui peut vous causer un problème déjà mentionné: cela peut fonctionner sur votre environnement de développement local et échouer ailleurs car vous avez oublié d'ajouter une bibliothèque, une dépendance, une modification mineure que vous avez effectuée sans y prêter attention et en gardant à l'esprit de l'ajouter. à votre environnement de menu fixe.
Une approche qui résout le problème ci-dessus consiste à compter sur docker[3], afin de configurer l'environnement que vous souhaitez utiliser. Cela signifie que chaque fois que vous modifiez quelque chose, vous devrez docker build
Une nouvelle image et docker run
Un nouveau conteneur basé sur cette image. Comme d'autres l'ont mentionné, pour définir le mode de création de vos images, vous devrez utiliser Dockerfiles
. Et si votre application a différents conteneurs interconnectés, vous devrez définir tous ces éléments (réseaux, liens, dépendances) dans un fichier docker-compose.yml
. Le processus répétitif de construction et d’exécution sera alors le travail de votre IDE ...
à partir de [1]
:
IDE
Les versions de Docker ne fournissent pas un IDE natif pour le développement avec Docker . L'interface principale est l'API en ligne de commande. Cependant, la plupart des principaux IDE (NetBeans, Eclipse, IntelliJ, Visual Studio) prennent en charge Docker via des plug-ins ou des add-ons.
Par exemple, à partir de [2]
:
Vous pouvez trouver des indications en fonction de votre cas (IDE, langue ...) ici:
Je pense que cette approche correspond à votre titre en disant "développer sur un conteneur docker" et je veux dire/comprendre le cas où quelqu'un a un conteneur en cours d'exécution avec un volume partagé et chaque fois qu'un changement se produit dans le code (en utilisant l'EDI), cela affecte directement le conteneur. Cela fonctionnera peut-être pour un cas et aura des limites pour d'autres cas. C'est à vous de faire votre bilan et de choisir votre voie.
Mes sources sont:
Vous avez également la possibilité d’exécuter le IDE en tant que conteneur de menu fixe, de sorte que vous n’avez pas besoin d’installer quoi que ce soit sur votre ordinateur.
Pour ce faire, vous avez besoin de:
- docker
- X11
- an IDE de votre choix.
Jetez un oeil à ce projet Java) qui exécute Java8 et se positionne dans une IDE IntelliJ:
https://github.com/marioluan/Java-data-structures
La configuration est assez simple:
Dockerfile
FROM openjdk:8-jdk-Alpine
# ttf-dejavu is required to render GUI under X11: https://github.com/docker-library/openjdk/issues/73
RUN apk --update add --no-cache ttf-dejavu
# install intellij
RUN wget -O /tmp/idea.tar.gz https://download-cf.jetbrains.com/idea/ideaIC-2017.3.4.tar.gz \
&& mkdir -p /usr/share/intellij \
&& tar -xf /tmp/idea.tar.gz --strip-components=1 -C /usr/share/intellij \
&& rm /tmp/idea.tar.gz
docker-compose.yml
version: '3'
services:
intellij:
build: .
environment:
- DISPLAY=$DISPLAY
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- /your/workspace:/tmp/your/workspace
- idea_cache:/root/.IdeaIC2017.3
- Java_cache:/root/.Java
working_dir: $APP_ROOT
command: /usr/share/intellij/bin/idea.sh
volumes:
idea_cache:
Java_cache:
Je peux ressentir ta douleur. Le développement de projets comportant plusieurs dépendances de bibliothèque peut rendre le processus de construction beaucoup plus fastidieux, chaque fois qu'une modification est apportée. Cela peut devenir frustrant.
Heureusement, vous pouvez résoudre ce problème en écrivant votre DockerFile
en utilisant maven-docker-plugin
https://github.com/spotify/docker-maven-plugin .
Cela économisera déjà les dépendances de bibliothèque disponibles sur votre hôte.
Par exemple, une demande d'extraction est ouverte dans un référentiel open source ici: https://github.com/iotaledger/iri/pull/481/files