docker用的时间比较久了,关于怎样把jar打成镜像,怎样基于已有mysql镜像添加额外初始化后封装成新的镜像,进行简单的说明。
1.jar封装镜像
from centos
# 设置本地为中文,解决中文乱码问题
RUN localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
# 修改时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 创建程序目录
RUN mkdir -p /opt/program/
# 修改字符编码,解决中文乱码问题
ENV LANG zh_CN.UTF-8
# 使用自己的JDK,“./linuxjdk64”为jdk路径
COPY ./linuxjdk64 /opt/linuxjdk64
# 设置JDK 环境变量
ENV JAVA_HOME /opt/linuxjdk64
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib
# “./target”里面保存运行的程序,比如“xxx.jar”
COPY ./target /opt/program/target
# 设置工作目录,就是“docker exec -it ID /bin/bash”进入的容器内部的目录
WORKDIR /opt/program/target
# 对外暴露的爽口
EXPOSE 12041
# 容器启东时执行的命令
CMD ./run.sh
run.sh中参考:
java -server -Xms1g -Xmx2g -Xss256k -jar demo.jar
2.基于mysql封装镜像
基于mysql添加添加脚本初始化。
#基础镜像使用的是mysql:latest(mysql:8)
FROM mysql:5.7.34
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV LANG zh_CN.UTF-8
#定义工作目录变量
ENV SQL_FILE_PATH /usr/local/sqlfile
#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
#定义要执行的sql文件名
ENV FILE_0 dms_node.sql
#定义要执行的shell文件名
ENV INSTALL_DDL_SHELL install_node_ddl.sh
#创建工作文件目录
RUN mkdir -p $SQL_FILE_PATH
#把sql文件复制到工作目录下
COPY ./sql/*.sql $SQL_FILE_PATH/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./sql/$INSTALL_DDL_SHELL $AUTO_RUN_DIR/
#EXPOSE 3306
#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DDL_SHELL
install_node_ddl.sh内容如下:
#!/bin/bash
if [ ! -d $SQL_FILE_PATH ]; then
exit 0
fi
Dir=$(cd `dirname $0`; pwd)
sqlFile_arr=($SQL_FILE_PATH/dms_node_manage.sql)
for sqlFile in ${sqlFile_arr[@]}
do
mysql -uroot -p$MYSQL_ROOT_PASSWORD < $sqlFile
if [ $? -ne 0 ]; then
echo "execute $sqlFile failed,please check file or mysql environment!"
echo "execute failed,please see the log for details"
exit
else
echo "ececute $sqlFile success !"
fi
done
if [ $? -eq 0 ]; then
mv $SQL_FILE_PATH $SQL_FILE_PATH.bak
fi
echo "execute all file compulete"