Docker compose问题,所有端口上都有一个应用程序

Docker compose问题,所有端口上都有一个应用程序,docker,docker-compose,module,port,Docker,Docker Compose,Module,Port,我已经完成了3个简单的rest应用程序 我用docker compose运行它们 似乎只有一个产品应用程序在所有3个端口上 我对码头工人很陌生 以下是Dockerfile: FROM adoptopenjdk/openjdk11:ubi ADD credit/target/credit-ChocoladeIcecream.jar . CMD java -jar credit-ChocoladeIcecream.jar FROM adoptopenjdk/openjdk11:ubi ADD cl

我已经完成了3个简单的rest应用程序 我用docker compose运行它们 似乎只有一个产品应用程序在所有3个端口上 我对码头工人很陌生

以下是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
我和邮递员核对了一下,试图为一些元素做广告,当我在每个端口上获得所有元素时,我只收到产品

它们都必须从一个罐子中运行,我如何才能使每个图像都从不同的罐子中创建

请帮助我了解出了什么问题


提前感谢。

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

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

credit\u应用程序:
图片:“信用:最新”
建造:
上下文:/
dockerfile:credit.dockerfile
#用DockerFile对另外两个重复上述步骤
另一种方法是使用相同的Dockerfile和不同的上下文,但需要从
jar
文件中删除
product-
(和其他)前缀。换句话说,如果它们具有相同的名称,则可以使用如下所示的Docker文件:

FROM adoptopenjdk/openjdk11:ubi
ADD target/ChocoladeIcecream.jar .
CMD java -jar ChocoladeIcecream.jar
要从此Dockerfile生成不同的图像,请设置不同的上下文:

credit\u应用程序:
图片:“信用:最新”
建造:
上下文:/信用证
#默认情况下,它将在上下文的根目录中查找Dockerfile,
#您需要指向它之外的文件(相对于位置)
#docker-compose.yml是)。
dockerfile:./dockerfile
还有一种方法可以使用
ARG
从一个Dockerfile创建各种图像,在这种情况下可以使用
添加正确的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\u应用程序:
图片:“信用:最新”
建造:
上下文:/
args:
应用程序:信用卡