Docker 撰写问题,所有端口上的一个应用程序

Docker compose problem , one application on all ports

我做了3个简单的休息申请 我 运行 他们用 docker-compose 似乎只有一个产品应用程序在所有 3 个端口上 我很新鲜 docker。

这里是 Dockerfile:

FROM adoptopenjdk/openjdk11:ubi
ADD credit/target/credit-ChocoladeIcecream.jar .
CMD java -jar credit-ChocoladeIcecream.jar

FROM adoptopenjdk/openjdk11:ubi
ADD client/target/client-ChocoladeIcecream.jar .
CMD java -jar client-ChocoladeIcecream.jar

FROM adoptopenjdk/openjdk11:ubi
ADD product/target/product-ChocoladeIcecream.jar .
CMD java -jar product-ChocoladeIcecream.jar

和 docker-撰写:

version: '3.9'

services:

  credit_app:

    image: 'credit:latest'
    build:
      context: ./
    container_name: credit
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
      - SPRING_DATASOURCE_USERNAME=${POSTGRES_USER}
      - SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD}
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
      - HOST_NAME=${HOST}
      - CLIENT_PORT=${PORT2}
      - PRODUCT_PORT=${PORT3}
    ports:
      - ${PORT1}:8080


  client_app:

    image: 'client:latest'
    build:
      context: ./
    container_name: client
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
      - SPRING_DATASOURCE_USERNAME=${POSTGRES_USER}
      - SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD}
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
      - HOST_NAME=${HOST}
      - CREDIT_PORT=${PORT1}
      - PRODUCT_PORT=${PORT3}
    ports:
      - ${PORT2}:8080


  product_app:

    image: 'product:latest'
    build:
      context: ./
    container_name: product
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
      - SPRING_DATASOURCE_USERNAME=${POSTGRES_USER}
      - SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD}
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
      - HOST_NAME=${HOST}
      - CLIENT_PORT=${PORT2}
      - CREDIT_PORT=${PORT1}
    ports:
      - ${PORT3}:8080

  db:

    image: 'postgres:13.1-alpine'
    container_name: db
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

如果需要,这里还有 .env 文件

HOST=localhost

PORT1=8089
PORT2=8090
PORT3=8091

POSTGRES_DB=database_name
POSTGRES_USER=user
POSTGRES_PASSWORD=pass123

我与邮递员核实,尝试添加一些元素,当我在每个端口上获取所有元素时,我只收到产品

它们必须全部 运行 来自一个 Jar,我怎样才能让每个图像都从不同的 jar 创建?

请帮助我了解哪里出了问题。

提前致谢。

问题出在 Dockerfile 中,您在所有三个服务中都使用了 product 图像。当您有多个 FROM 语句时,它不会构建三个图像。这用于多阶段构建,例如当您使用一个图像(阶段)编译二进制文件而另一个图像仅用于保存没有编译器、内核头文件等的产品时

解决此问题的一种方法是将 Dockerfile 拆分为三个单独的文件(credit.Dockerfileclient.Dockerfileproduct.Dockerfile),然后在各自的服务中提及每个文件:

  credit_app:
    image: 'credit:latest'
    build:
      context: ./
      dockerfile: credit.Dockerfile
    # repeat for other two with their Dockerfiles

另一种方法是使用相同的 Dockerfile 和不同的上下文,但需要您从 jar 文件中删除 product-(和其他)前缀。换句话说,如果它们具有相同的名称,你可以使用这样的 Dockefile:

FROM adoptopenjdk/openjdk11:ubi
ADD target/ChocoladeIcecream.jar .
CMD java -jar ChocoladeIcecream.jar

要从这个 Dockerfile 构建不同的图像,您需要设置不同的上下文:

  credit_app:
    image: 'credit:latest'
    build:
      context: ./credit

      # By default it will look for the Dockerfile inside the root of context,
      # and you need to point to the file outside of it (relative to where
      # the docker-compose.yml is).
      dockerfile: ./Dockerfile

还有一种方法可以使用 ARG 从一个 Dockerfile 创建各种图像,在这种情况下它可以用于 ADD 正确的 jar 文件,但它不适用于CMD。因此,要使用 ARG,您需要容器内的 jar 个文件具有相同的名称:

FROM adoptopenjdk/openjdk11:ubi
ARG APP
# Add file without prefix
ADD ${APP}/target/${APP}-ChocoladeIcecream.jar ChocoladeIcecream.jar
CMD java -jar ChocoladeIcecream.jar

然后你可以在docker-compose.yml中设置APP参数:

  credit_app:
    image: 'credit:latest'
    build:
      context: ./
      args:
        APP: credit