Escribí una API REST basada en HTTP de Scala y Akka y creé Dockerfile para crear una imagen de Docker para esta API. Mi Dockerfile es el siguiente:
FROM maven:3.6.0-jdk-8-alpine AS MAVEN_TOOL_CHAIN COPY pom.xml /tmp/parent/ COPY data-catalogue/pom.xml /tmp/parent/data-catalogue/ COPY data-catalogue/src /tmp/parent/data-catalogue/src/ WORKDIR /tmp/parent/data-catalogue/ RUN mvn package FROM java:openjdk-8 COPY --from=MAVEN_TOOL_CHAIN /tmp/parent/data-catalogue/target/data-catalogue-1.0-SNAPSHOT.jar /opt/data-catalogue.jar COPY data-catalogue/src/main/resources/logback.xml /opt/logback.xml ENTRYPOINT ["java", "-Dlogging.config=/opt/logback.xml", "-jar", "/opt/data-catalogue.jar", "prod"] CMD ["8080"]Todo está bien hasta ahora. Puedo ejecutar un contenedor usando esta imagen.
Ahora, el requisito es ejecutar dos contenedores usando esta imagen en el mismo host de Docker. Modifiqué la clase principal de las API REST de modo que tomará el número de puerto en el que debe ejecutarse como un argumento de línea de comando. Si no se proporciona el argumento de la línea de comandos, escuchará las solicitudes en el puerto 8080.
Me gustaría saber cómo proporciono un parámetro de línea de comando a mi API REST al iniciar el contenedor.
Por ejemplo:
Intenté usar ENTRYPOINT y CMD para esto, pero mi argumento de la línea de comando simplemente no llega a la clase principal y la API REST comienza solo en el puerto 8080.
A través de variables de entorno
En Dockerfile:
ENV PORT 8080 Puede anular el env anterior en el cmd pasando -e por ejemplo
docker run -d my_image -e "PORT=5555" Consume el env en tu código de aplicación
Entonces, por ejemplo, si no proporciona env en el cmd, su código de aplicación recibirá 8080 como valor de PUERTO. Si anula el env en cmd, su código de aplicación recibirá 5555 como valor de PUERTO
El mapeo de Docker PORT es su respuesta.
Dockerizar su API es exactamente lo contrario para proporcionarle a su API el puerto en el que desea ejecutarla cada vez. Eso es exactamente lo que no quieres hacer cuando vas por el camino de Docker.
Su API debería poder atender sus solicitudes a través de cualquier puerto que decida EXPOSE en su imagen acoplable, y luego, en tiempo de ejecución, solo necesita asignar cualquier puerto que desee desde su host al puerto interno de su API (que , dentro de su contenedor, estará siempre atendiendo al mismo puerto "interno".
Entonces... ¿cómo se ve?
docker run -d --name api-1 -p 5555:8080 my/apiy luego...
docker run -d --name api-2 -p 1111:8080 my/apiAhora ambas instancias se ejecutan en su host y puede acceder a ambas, cada una con un puerto de host diferente (incluso cuando internamente usan el mismo número de puerto)
puede configurar ARG en su contenedor:
ARG MYPORTluego exportarlo como:
CMD [ $MYPORT ]luego inicie su ventana acoplable de esta manera:
export MYPORT=5000 ; docker run ....