62 votes

Utiliser un IDE tout en développant sur un conteneur docker

Il y a quelque chose que je n'arrive pas à obtenir lorsque je développe une application en utilisant docker conteneurs.

Supposons que je développe une application java et que je configure un conteneur java avec une image de base jdk 8, je dois encore installer java 8 jdk sur ma machine de développement locale, puisque l'IDE que je vais utiliser va chercher les bibliothèques d'exécution sur la machine locale et non sur le conteneur docker.

Est-ce que c'est correct ou est-ce que je rate quelque chose ? Il y a des choses que je pourrai faire entièrement sur le conteneur docker, comme la configuration d'une base de données, mais d'autres que je devrai aussi faire sur ma machine de développement locale et essayer de les faire correspondre à mon image docker, par exemple un runtime de langage comme java ou python pour pouvoir utiliser l'IDE.

1 votes

Votre machine locale est votre environnement de développement local, n'est-ce pas ? Donc, finalement, une fois que vous avez terminé le développement, vous voulez le déployer en utilisant des conteneurs ?

2 votes

Cela dépend de la quantité de Docker que votre équipe va utiliser. L'un des arguments de vente de Docker est la standardisation, de sorte qu'aucun développeur ne puisse dire " ça marche sur ma machine, pourquoi ça ne marche pas sur la vôtre ? ". Si un conteneur "dev" est standardisé, et que tout le monde l'utilise, alors les bibliothèques et les outils de chacun devraient correspondre.

1 votes

@Shanky Je veux développer sur ma machine locale et faire les tests sur le conteneur au fur et à mesure que je développe. Disons que je modifie un fichier dans mon projet et que j'exécute les modifications sur le conteneur.

23voto

antithesis Points 386

Mises à jour :


Poste original :

Il y a quelque chose que je ne comprends pas lorsque je développe une application en utilisant des conteneurs Docker.

C'est bon, ce n'est pas quelque chose d'insignifiant. Essayez de voir la situation dans son ensemble, il s'agit de créer une Pipeline de développement (ou Pipeline CI/CD si vous aimez utiliser les termes Intégration continue / livraison continue ).

enter image description here

L'image ci-dessus provient de [2]

Limitations lors de la mise en place d'un environnement de développement local

Supposons que je développe une application java et que je configure un conteneur java avec une image de base jdk 8, je dois encore installer java 8 jdk sur ma machine de développement locale, puisque l'IDE que je vais utiliser va chercher les bibliothèques d'exécution sur la machine locale et non sur le conteneur docker.

Cette option peut vous causer un problème déjà mentionné : elle peut fonctionner sur votre environnement de développement local et échouer ailleurs parce que vous avez oublié d'ajouter une bibliothèque, une dépendance, une modification mineure que vous avez effectuée sans faire attention et sans penser à l'ajouter à votre environnement Docker.

Vous pouvez vous en tenir à Docker pendant le développement

Une approche qui résout le problème ci-dessus est de s'appuyer 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 la façon dont vos images vont être construites, vous devrez utiliser la fonction Dockerfiles . Et si votre application comporte différents conteneurs interconnectés, vous devrez définir tous ces éléments (réseaux, liens, dépendances) à l'intérieur d'un fichier de type docker-compose.yml fichier. Le processus répétitif de construction et d'exécution sera alors le travail de votre IDE...

IDEs et plugins/add-ons

de [1] :

IDE

Versions de Docker ne fournissent pas d'IDE natif pour le développement avec Docker . L'interface principale est l'API en ligne de commande. Toutefois, la plupart des principaux IDE (NetBeans, Eclipse, IntelliJ, Visual Studio) prennent en charge Docker par le biais de plugins ou de modules complémentaires.

Par exemple, de [2] :

enter image description here

Docker Labs - Tutoriels sur les outils de développement

Vous pouvez trouver quelques directives en fonction de votre cas (IDE, langue...) ici :

Volumes partagés | Rechargement à chaud | "surveillance" des changements de fichiers

Je pense que cette approche correspond à votre titre qui dit "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'IDE), cela affecte le conteneur directement. Peut-être cela fonctionnera-t-il dans un cas et aura-t-il des limites dans d'autres cas. C'est à vous de faire vos évaluations et de choisir votre voie.

Mes sources sont :

22voto

Mario Souza Points 495

Vous avez également la possibilité d'exécuter l'EDI en tant que conteneur docker, de sorte que vous n'avez pas besoin d'installer quoi que ce soit sur votre machine.

Pour ce faire, vous avez besoin :
- docker
- X11
- un IDE de votre choix.

Jetez un coup d'œil à ce projet java qui exécute java8 et gradle dans un IDE IntelliJ :

https://github.com/marioluan/java-data-structures

L'installation 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:

7 votes

Ce n'est pas parce que vous le pouvez que c'est une bonne idée. L'entropie introduite par le développement à l'intérieur de conteneurs Docker l'emporte largement sur ses avantages.

0 votes

Eh bien, c'est à celui qui fait le choix.

1 votes

@tiagoboldt. Pourriez-vous expliquer ce que vous entendez par "entropie introduite par ...". Parce que je pense que la solution est bonne. Je suppose que quelque chose m'échappe.

0voto

Ahab Points 261

Je peux ressentir votre douleur. Développer des projets qui ont de multiples dépendances de bibliothèques peut rendre le processus de construction beaucoup plus long, chaque fois qu'un changement a été fait. Cela peut devenir frustrant.

Heureusement, vous pouvez résoudre ce problème en rédigeant votre DockerFile en utilisant maven-docker-plugin https://github.com/spotify/docker-maven-plugin .

Cela permet de ne pas utiliser les dépendances de bibliothèques déjà disponibles sur votre hôte.

À titre d'exemple, j'ai une demande de retrait ouverte dans un dépôt de sources ouvertes ici : https://github.com/iotaledger/iri/pull/481/files

1 votes

Ils voulaient éviter de devoir installer des bibliothèques sur l'hôte, et non les réutiliser dans Docker.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X