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.Dockerfile
、client.Dockerfile
、product.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
我做了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.Dockerfile
、client.Dockerfile
、product.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