资讯

展开

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}

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!