hub - Usando un IDE mientras se desarrolla en un contenedor docker
dockers container download (3)
Hay algo que no estoy obteniendo al desarrollar una aplicación mientras uso los contenedores docker
.
Digamos que estoy desarrollando una aplicación java y configuré un contenedor java con la imagen base jdk 8, todavía necesito instalar java 8 jdk en mi máquina de desarrollo local, ya que el IDE que voy a usar va a buscar el tiempo de ejecución bibliotecas en la máquina local no el contenedor docker.
¿Es esto correcto o me estoy perdiendo algo? Algunas cosas podré hacer por completo en el contenedor de la ventana acoplable, como configurar una base de datos, pero también tendré que hacer algunas cosas en mi máquina de desarrollo local e intentar asociarla con mi imagen de la ventana acoplable, por ejemplo, un tiempo de ejecución de idioma como Java o Python por el bien de usar el IDE.
Actualizaciones:
- 2018/04/17: http://docker-sync.io/
- 2018/03/18: compruebe skaffold en GoogleCloudPlatform.
Publicación original:
Hay algo que no estoy obteniendo al desarrollar una aplicación mientras uso los contenedores docker.
Está bien, esto no es algo trivial. Intente ver el panorama general, se trata de crear un Canal de desarrollo (o Canal de CI / CD si desea utilizar los términos Integración continua / Entrega continua ).
La imagen de arriba es de [2]
Limitaciones al configurar un entorno de desarrollo local
Digamos que estoy desarrollando una aplicación java y configuré un contenedor java con la imagen base jdk 8, todavía necesito instalar java 8 jdk en mi máquina de desarrollo local, ya que el IDE que voy a usar va a buscar el tiempo de ejecución bibliotecas en la máquina local no el contenedor docker.
Esta es una opción que puede causarle un problema ya mencionado: puede funcionar en su entorno de desarrollo local y fallar en otra parte porque olvidó agregar una biblioteca, una dependencia, un cambio menor que hizo sin prestar atención y tener en cuenta que agregarlo a su entorno docker.
Mejor atenerse a la ventana acoplable mientras se desarrolla.
Un enfoque que resuelve el problema anterior es confiar en la ventana acoplable [3] para configurar el entorno que desea utilizar. Esto significa que cada vez que cambie algo, tendrá que docker build
una nueva imagen en la docker run
y docker run
un contenedor nuevo en función de esta imagen. Como han mencionado otros, para definir cómo se construirán sus imágenes, tendrá que usar Dockerfiles
. Y si su aplicación tiene diferentes contenedores interconectados, tendrá que definir todos estos (redes, enlaces, dependencias) dentro de un archivo docker-compose.yml
. El proceso repetitivo de construir y correr será el trabajo de su IDE ...
IDEs y complementos / complementos
de [1]
:
IDE
Las versiones de Docker no proporcionan un IDE nativo para desarrollar con Docker . La interfaz principal es la línea de comandos API. Sin embargo, la mayoría de los IDE líderes (NetBeans, Eclipse, IntelliJ, Visual Studio) tienen algún soporte para Docker a través de complementos o complementos.
Por ejemplo, desde [2]
:
Docker Labs - Tutoriales de herramientas de desarrollo
Puede encontrar algunas pautas según su caso (IDE, idioma ...) aquí:
Volúmenes compartidos | Recarga en caliente | "viendo" para cambios de archivo
Creo que este enfoque coincide con su título que dice "desarrollar en un contenedor docker" y quiero decir / entender el caso en el que alguien tiene un contenedor en ejecución con un volumen compartido y cada vez que se produce un cambio en el código (utilizando el IDE), esto afecta al contenedor directamente. Tal vez esto funcione para un caso y tenga limitaciones para otros casos. Depende de usted hacer sus evaluaciones y elegir su camino.
Mis fuentes son:
-
[1]
Arquitectura de referencia de Docker: Desarrollo de las mejores prácticas de canalización utilizando Docker EE -
[2]
Explorando Docker en CI / CD -
[3]
¿Qué es un contenedor? video de VMware Cloud-Native
Puedo sentir tu dolor. El desarrollo de proyectos que tienen múltiples dependencias de biblioteca puede hacer que el proceso de construcción consuma mucho más tiempo, cada vez que se realiza un cambio. Esto puede ser frustrante.
Afortunadamente, puede solucionar este problema escribiendo su DockerFile
mediante el uso de maven-docker-plugin
https://github.com/spotify/docker-maven-plugin .
Esto ahorrará el uso ya dependencias de biblioteca disponibles en su host.
Como ejemplo, tengo una solicitud de extracción abierta en un repositorio de código abierto aquí: https://github.com/iotaledger/iri/pull/481/files
También tiene la opción de ejecutar el IDE como un contenedor docker, por lo que no necesita instalar nada en su máquina.
Para ello, necesitas:
- estibador
- X11
- Un IDE de su elección.
Eche un vistazo a este proyecto java que ejecuta java8 y gradle dentro de un IDE IntelliJ:
https://github.com/marioluan/java-data-structures
La configuración es bastante sencilla:
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: