dockerfile启动多个服务
简介
通过用dockerfile来制作一个镜像启动多个服务的时候。出现了问题,容器启动后,当start.sh启动脚本执行结束后,发现容器退出运行了。之所以出现这个问题是因为你没有一个一直可以持续运行的前台进程,所以就导致了容器一启动后立马又退出了。然后尝试了好几种方法,发现都不适合我这个,如:在CMD [“bash”,"-c","./start.sh start && tail -f /dev/null"]里面加入tail -f /dev/null"来让他实时打印,发现不行。我的解决办法如下:
linux系统里面启动服务如下:
apache-activemq-5.15.8文件内容如下:
UltraATUFileParseServer文件夹内容如下:
UltraATUUnzipServer文件夹内容如下:
UltraRemoreServer-GD文件夹内容如下:
Dockerfile内容如下:
FROM centos
MAINTAINER test@etonetech.com
#在镜像/opt目录下面创建wrapper目录
RUN mkdir /opt/wrapper
RUN mkdir /opt/wrapper/apache-activemq-5.15.8
RUN mkdir /opt/wrapper/UltraATUFileParseServer
RUN mkdir /opt/wrapper/UltraATUUnzipServer
RUN mkdir /opt/wrapper/UltraRemoreServer-GD
#在镜像/data目录下创建数据存放路径
RUN mkdir /data
RUN mkdir /data/adtpapp
RUN mkdir /data/adtpapp/atu
RUN mkdir /data/adtpapp/atu/Dtlog
RUN mkdir /data/adtpapp/atu/Eclog
RUN mkdir /data/adtpapp/atu/UltraATUSqlldrServer
RUN mkdir /data/adtpapp/atu/lteftpdir
ADD ./jdk-8u172-linux-x64.tar.gz /usr/java
#拷贝宿主机上的zip包至centos镜像里面的/opt/wrapper目录下面,
#这样拷贝它不会将宿主机上的当前文件夹拷贝到镜像里面,只能拷贝文件夹里面的文件
#所以要先在镜像里面创建对应的文件名,好像可以加参数-r来实现将当前文件夹也能拷贝过去 COPY -r 不过我没尝试过
COPY ./apache-activemq-5.15.8 /opt/wrapper/apache-activemq-5.15.8
COPY ./UltraATUFileParseServer /opt/wrapper/UltraATUFileParseServer
COPY ./UltraATUUnzipServer /opt/wrapper/UltraATUUnzipServer
COPY ./UltraRemoreServer-GD /opt/wrapper/UltraRemoreServer-GD
COPY ./start.sh /opt/wrapper
WORKDIR /opt/wrapper
RUN chmod -x start.sh
#启动服务
#ENTRYPOINT ["sh","./start.sh"]
#CMD ["bash","-c","./start.sh start && tail -f /dev/null"]
CMD sh /opt/wrapper/start.sh
start.sh内容如下:
启动后缀带&表示这是一个后台服务,没有的表示这是一个前台服务(可以有多个后台服务运行,但是只能有一个前台服务运行),我这里让docker容器持续运行,有二种方法,一种是指定你项目中的一个日志文件进行实时输出日志信息,用tail -f就像我下面末尾写的那个,第二种是直接创建一个空文件,然后让用tail -f让他一直实时输出这个空文件,这样这个前台服务就会一直在运行,且容器就不会启动完成后自动退出了。
#!/bin/bash
sh /opt/wrapper/apache-activemq-5.15.8/bin/activemq start &
#重新启动UltraATUFileParseServer服务
#sh /opt/wrapper/UltraATUFileParseServer/bin/UltraATUFileParseServer status
sh /opt/wrapper/UltraATUFileParseServer/bin/UltraATUFileParseServer start &
#sh /opt/wrapper/UltraATUFileParseServer/bin/UltraATUFileParseServer stop
#sh /opt/wrapper/UltraATUFileParseServer/bin/UltraATUFileParseServer restart
#重新启动UltraATUUnzipServer服务
#sh /opt/wrapper/UltraATUUnzipServer/bin/UltraATUUnzipServer status
sh /opt/wrapper/UltraATUUnzipServer/bin/UltraATUUnzipServer start &
#sh /opt/wrapper/UltraATUUnzipServer/bin/UltraATUUnzipServer stop
#sh /opt/wrapper/UltraATUUnzipServer/bin/UltraATUUnzipServer restart
#重新启动UltraRemoreServer服务
#sh /opt/wrapper/UltraRemoreServer-GD/bin/UltraRemoreServer status
sh /opt/wrapper/UltraRemoreServer-GD/bin/UltraRemoreServer start &
#sh /opt/wrapper/UltraRemoreServer-GD/bin/UltraRemoreServer stop
#sh /opt/wrapper/UltraRemoreServer-GD/bin/UltraRemoreServer restart
#第一种实时打印项目里面的日志信息,其实二种方法一样,这里是让程序以前台服务来运行
#tail -f /opt/wrappper/UltraATUFileParseServer/logs/upzip.txt
#第二种创建一个空的
touch /opt/a
tail -f /opt/a
制作镜像并启动
然后docker build -t mydocker . 开始制作镜像,这里的.表示dockerfile文件的当前位置。
因为我的的dockerfile文件夹在wrapper文件夹里面而且又是在wrapper文件夹里面执行的这条命令,所以用.表示当前文件指定dockerfile文件位置就可以了。-t 是给自己制作的镜像取名。
然后用docker images查看自己的镜像文件
注意:这里如果不用-d后台启动的话,程序会一直停留在里面,因为你有用tail -f它会一直显示你的a文件信息,因为你a文件什么也没有所以是空的,所以一直停留在里面不出来,你又不能执行其他操作,只能在重新启动一个xshell连接。
发现docker服务一直在运行,且容器里面的服务也启动了,想要的结果已经达到。
好了,我的分享就到这里了,希望能对各位有帮助吧。