最近想把docker复习一下,于是在自己搭建的jenkins机器里做docker练习,我是用的docker命令来运行容器及容器里的jar应用,但是一直启动不成功,通过docker logs 容器ID|容器名称要么没日志,要么返回java命令未找到,于时不停的查资料,大多都是通过dockerfile构建的,要配置ENV环境变量,可是我配置了也没有用,我的docker命令如下:

docker run -di --name=jdk_api_v2 -p 8110:8111 -v /root/software/:/mnt/software/ --env JAVA_HOME=/mnt/software/jdk8 --env PATH=$PATH:$JAVA_HOME/bin centos_jdk_i:v1 /bin/bash /usr/bin/run.sh 

百思不得其解之后,根据网上的docker inspect 容器ID|容器名称,查看容器环境,发现竟然是环境变量配置错误,如下图:
在这里插入图片描述
可以看到我在命令中使用的是$JAVA_HOME,但是居然使用的是宿主机的JDK路径,所以这里最好使用绝对路径,不要使用相对路径。
修改后的命令如下:

docker run -di --name=jdk_api_v3 -p 8110:8111 -v /root/software/:/mnt/software/ --env JAVA_HOME=/mnt/software/jdk8 --env PATH=$PATH:/mnt/software/jdk8/bin centos_jdk_i:v1 /bin/bash /usr/bin/run.sh

另外,在使用docker commit 容器ID|容器名称 新的镜像名称:镜像版本我发现,环境变量会丢失,如果不进行目录映射,原来配置的java就会丢失(因为最开始我是通过-v把宿主机目录映射到容器目录,但是在运行容器通过-v映射一样没效果,就是因为从新构建的镜像创建容器无法读取到/etc/profile 环境变量信息),也就是构建的docker镜像并不记录上一次容器的目录映射和没有持久化到文件系统中的信息,也即Docker容器的无状态。

对了,我上面的构建流程是共享jdk路径,然后在容器的/etc/profile.d/my_env.sh中配置环境变量,其实可以更简单,直接将宿主机环境变量给容器使用,并把宿主机命令的文件夹映射到容器即可。如下:

docker run -di --name=jdk_api_v4 -p 8112:8111 -v /root/software/api/:/mnt/software/api/ -v /root/software/jdk8:/root/software/jdk8 --env JAVA_HOME=$JAVA_HOME --env PATH=$PATH:$JAVA_HOME/bin centos_jdk_i:v1 /bin/bash /usr/bin/run.sh

上面先影射了jar包目录,然后影射了JDK环境目录,并配置JDK环境,这样完全不用麻烦的捣腾容器里的/etc/profile.d/my_env.sh。当然这个也是受下面参考文章的启发。

参考文章:
解析docker中的环境变量使用和常见问题解决
centos7构建jdk8及踩坑经历(docker bash: java: command not found)
只需搞定Docker,环境问题再也不是测开路上的『坑』
Docker入门(三)——Docker容器部署jar包并运行
Docker无法正常启动的原因及解决办法
如何查看Docker容器环境变量,如何向容器传递环境变量
docker环境变量报错
解决docker容器不能自动加载环境变量问题
docker容器共享宿主机环境,如jdk

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐