Docker compose问题,所有端口上都有一个应用程序
我已经完成了3个简单的rest应用程序 我用docker compose运行它们 似乎只有一个产品应用程序在所有3个端口上 我对码头工人很陌生 以下是Dockerfile: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
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:
应用程序:信用卡