在做镜像的过程中遇到较多问题,踩了很多坑,简单记录如下
运行后就exited(0)
问题:使用CMD ["sh","./startup.sh","&"] 或者ENTRYPOINT ["sh","./startup.sh"]制作的镜像,docker run -d 不加-it参数运行后就exited(0),docker run -dit 增加-it参数则正常运行。
做的组件需要运行在公司的SaaS平台上,不通过CI平台发布、自定义的仅支持基础功能,docker run -d 不加-it参数可以运行OK,在SaaS平台上也可以OK。
猜测是容器执行了命令后,结束容器退出,1号进程不是常驻的服务器进行,尝试实验:
1.脚本中增加sleep 999999d,
2.CMD 后面多个命令先指定一个1号进程为bash的等,
3.不使用脚本,直接使用启动命令,且不放入后台有tty窗口输出的
实验结果:
1增加指定时间是OK的,但是不是正常解决途径;
2.增加多个命令没找到可行方案,后续再做下实验(待研究);
3.执行使用命令也是可行的,启动脚本增加ps -aux,可以看到1号进程是startup.sh,执行结束就退出。
CMD、ENTRYPOINT参数使用/原理,查看很多资料,https://www.cnblogs.com/ilinuxer/p/6188303.html
- Dockerfile 如下
# Version V0.0.1
FROM openjdk:8-jre-slim
MAINTAINER cszbb <wdjlwz@163.com>
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
apt-get clean &&\
apt-get update && \
apt-get -qy install \
wget \
telnet \
iputils-ping \
unzip \
procps \
net-tools \
iproute2
#ENV Setting
#copy jmeter包到容器内部
RUN mkdir /mock
COPY v-mock1.1.0.jar /mock
COPY startup.sh /mock
WORKDIR /mock
RUN chmod 777 startup.sh
#CMD ["sh","./startup.sh","&"]
CMD nohup java -jar v-mock*.jar --server.port=18089
#ENTRYPOINT ["sh","./startup.sh"]
EXPOSE 18089
startup.sh如下(不使用)
#!/bin/bash
nohup java -jar v-mock*.jar --server.port=18089 > nohup.log 2>&1 &
#2>&1 2 标准错误(错误信息输出);>&1 继续输出到标准输出
echo "url:http://127.0.0.1:18089"
echo "U/P:vmock/vmock123"
ps -aux
build是找不到文件或目录
例如如下,报错,增加RUN pwd 查看发现ADD后目录切换为Autotest ,建议使用./ 或者绝对路径
ADD Autotest .
# RUN pwd && ls -l
RUN cd Autotest
build时Sending build context to Docker daemon 9.5GB
build时时间过长,Sending build context to Docker daemon 9.5GB,Dcokerfile 、程序、等在/data目录下,此目录下由很多其他业务,有40~50GB的文件。
build会将指定的目录下的所有文件发到Docker daemon中,所一定指定好程序目录或者创建好目录,将dockerfile及程序都在此目录下执行,减少误操作风险。