• 方法一:
    Dockerfile
#基础镜像
FROM java:8

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#把你的项目war包引入到容器的root目录下
COPY *.war /app.war

RUN echo \
"#!/bin/sh\n"\
"nohup java -jar /app.war --server.port=8085 &\n"\
"nohup java -jar /app.war --server.port=8086 &"\
>> /start.sh

RUN chmod +x /start.sh
CMD nohup sh -c "/start.sh && java -jar /app.war --server.port=8087"

  • 方法二
    Dockerfile
#基础镜像
FROM java:8

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#把你的项目war包引入到容器的root目录下
COPY *.war /app.war
COPY start.sh /start.sh
RUN  chmod +x /start.sh

#项目的启动方式
ENTRYPOINT ["./start.sh"]

start.sh

#!/bin/bash

# 命令后加入 & ,保持程序后台持续运行
nohup java -jar /app.war --server.port=8085 & 
nohup java -jar /app.war --server.port=8086 &

# 死循环,保持docker前台运行
while [[ true ]]; do
    sleep 1
done

或者(推荐下面的写法,上面的while写法可能会有性能损耗,待验证)

#!/bin/bash

# 命令后加入 & ,保持程序后台持续运行
nohup java -jar /app.war --server.port=8085 & 
java -jar /app.war --server.port=8086

docker-compose.yml

version: '3.8'
services:
    demo-dk:
        image: demo-dk:1.0
        build:
          context: .
          dockerfile: Dockerfile
        ports:
            - "8085:8085"
            - "8086:8086"
            - "8087:8087"
        logging:
            driver: 'json-file'
            options:
                max-size: '30m'
                max-file: '5' 

shell.sh

docker-compose down && docker rmi -f demo-dk:1.0 && docker-compose up -d --build

测试时将war、Dockerfile、shell.sh、start.sh 放在同一目录下,执行

sh shell.sh

完整源码参考: https://gitee.com/00fly/docker-demo/tree/master/docker/1-n

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐