Dockerfile制作镜像常用Shell脚本记录
作者:快盘下载 人气:一、常规命令和使用记录
1、定义变量、判断匹配、赋值等
//定义变量 addr=a namespace=b //判断匹配环境变量;并赋值 case ;$ENV; in dev) namespace=dev ;; fat) addr=127.0.0.1 namespace=fat ;; uat) echo ;nothing;;; pre) echo ;nothing;;; *) ;; esac
2、通过shell构建dockerfile文件;示例如下
cat > Dockerfile <<EOF { FROM xxx VOLUME /tmp ARG JAR_FILE ADD ${JAR_FILE} xxx.jar ADD xx ADD xx RUN xx ENV xx ... ENTRYPOINT [;java;, ;-jar;, ;xx.jar;] } EOF
语法说明;
(1);cat > 文件名(包括后缀) <<EOF
EOF;末尾的EOF必须单独占一行
(2);此语法也可以构建yaml、json等文件
3、Dockerfile 常用命令说明
FROM;表示当前镜像基于哪个镜像 VOLUME /tmp;默认在/tmp目录把shell脚本持久化到此目录下;并执行 WORKDIR;进入容器的默认目录落脚点 ADD;拷贝文件并且重命名(ADD source.jar target.jar 将应用jar包复制到容器中名为target) RUN;运行指定的shell脚本命令 ENV;构建镜像时声明环境变量;如;JAVA_HOME EXPOSE;声明该服务要提供的端口;并不是真正的发布端口 ENTRYPOINT;容器启动时运行的命令;相当于我们在命令行中输入java -jar xxx.jar;为了缩短 Tomcat 的启动时间;添加java.security.egd的系统属性指向file:/dev/./urandom
说明;
(1);VOLUME 和 WORKDIR 不能定义相同名称的目录;否则报错
(2);ENTRYPOINT 参数如果包含 nohup 将无法使用 docker logs cName 此命令;但会自动在落脚点工作目录中生成 nohup.out 日志文件;可以通过此文件查看日志信息
4、日志文件是一个应用非常重要的排查问题的依据;所以通常是做法是把 jar文件 和 日志文件 所在的目录挂载到宿主机
(1);挂载到宿主机目录后;构建 Dcokerfile 镜像时;只需覆盖宿主机目录中的 jar文件即可
(2);把jar文件和日志文件一并挂载出来;因此在宿主机目录也可以查看实时日志
注意;
(1);由于容器中jar文件目录已经挂载到宿主机;所以只需把jar文件覆盖到宿主机目录;不需要在添加到 Dockerfile 镜像中
(2);如果宿主机和镜像中都添加了Jar文件;容器将无法运行;因此只需在宿主机目录添加Jar文件就行了
二、实测可运行的shell脚步-备份
1、可以实现单机一键部署
#!/bin/bash active=dev addr=http://xxx:8848 namespace=dev case ;$Env; in dev) active=dev addr=http://xxx:8848 namespace=dev ;; loc) active=loc addr=http://xxx:8848 namespace=loc ;; sit) active=sit addr=http://xxx:8848 namespace=sit ;; uat) echo ;nothing;;; pre) echo ;nothing;;; *) ;; esac profiles_active=;-Dspring.profiles.active=${active}; java_nacos_opts=;-Dspring.cloud.nacos.discovery.server-addr=${addr} -Dspring.cloud.nacos.discovery.namespace=${namespace}; project_path=//devtools/jenkins/jenkins_home/workspace/test ############################################## Dockerfile start ###################################################### workDir=/foothold cat>DockerfileEof<<EOF FROM openjdk:11.0.16 VOLUME /tmp WORKDIR ${workDir} #ADD ${serviceName}/target/mybatis-plus-join-practice-1.0-SNAPSHOT.jar ${workDir}/app/mybatis-plus-join-practice-1.0-SNAPSHOT.jar #RUN sh -c ;touch ${workDir}/app/mybatis-plus-join-practice-1.0-SNAPSHOT.jar; RUN echo ;Asia/Shanghai; > //etc/timezone #RUN apt-get update && apt-get install -y vim EXPOSE 7000 ENTRYPOINT [;nohup;,;java;,;${profiles_active};,;-Djava.security.egd=file:/dev/./urandom;,;-jar;,;${workDir}/mybatis-plus-join-practice-1.0-SNAPSHOT.jar;,;>;,;${workDir}/aa.log;,;&;] EOF #向容器添加jar文件;因为是挂载不能在Dockerfile中添加所以在主机目录添加 cp ${serviceName}/target/mybatis-plus-join-practice-1.0-SNAPSHOT.jar ${serviceName}/workdir/ ############################################## Dockerfile end ###################################################### cName=mybatis-plus-join-practice docker ps | grep ${cName} dcoker stop ${cName} docker rm -f ${cName} docker rmi ${cName}:${Tag} docker build -f ./DockerfileEof -t ${cName}:${Tag} . docker run --name ${cName} -tid -p 7000:7000 -u root -v ${project_path}/${serviceName}/workdir:${workDir} --privileged=true ${cName}:${Tag}
加载全部内容