外贸开发产品网站模板,用dw制作个人简历网页,小网站如何做,上海一网通办官网文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述
此时处在 /home/ubuntu/app 目录下#xff0c;并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令#xff1a;
# 映射 8859 端口
# 容器名为 jenkins-demo
#… 文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述
此时处在 /home/ubuntu/app 目录下并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令
# 映射 8859 端口
# 容器名为 jenkins-demo
# 将 jenkins-0.0.1-SNAPSHOT.jar 复制到容器内的 /app.jar
# 以 jdk11 为容器镜像
# 执行命令 java -jar /app.jar 运行 java 程序
docker run -dp 8859:8859 \
--name jenkins-demo \
-v jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
openjdk:11 \
java -jar /app.jar但遗憾的是当我执行命令后并没有运行起来。 2.问题分析
我们先查看一下日志 提示错误信息Error: Invalid or corrupt jarfile /app.jar
该错误表示的是 jar 文件无效或损坏于是我开始考虑是不是 -v 挂载有问题。
于是我使用 docker inspect jenkins-demo 查看该容器信息特别是挂载情况。然后查看 Mounts 下的信息 我发现 jenkins-0.0.1-SNAPSHOT.jar 成了数据卷名称/app.jar 是容器内的目录。
这时候我才突然想起来如果在 -v 时直接写个名称那么 docker 会将它识别为是一个数据卷名称而不是本地文件或目录名。 即本地目录或文件必须以 / 或 ./ 开头如果直接以名字开头会被识别为数据卷名而非本地目录名。例如
# 会被识别为一个数据卷叫mysql运行时会自动创建这个数据卷
-v mysql:/var/lib/mysql# 会被识别为当前目录下的mysql目录运行时如果不存在会创建目录
-v ./mysql:/var/lib/mysql3.问题解决
我们可以将之前的 docker run 命令修改为以下两种方式 绝对路径方式 docker run -dp 8859:8859 \
--name jenkins-demo \
-v /home/ubuntu/app/jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
openjdk:11 \
java -jar /app.jar相对路径方式 # 需要保存当前执行命令所在位置是在 /home/ubuntu/app 目录下因为我将 jenkins-0.0.1-SNAPSHOT.jar 就是放在了此目录下
docker run -dp 8859:8859 \
--name jenkins-demo \
-v ./jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
openjdk:11 \
java -jar /app.jar这时候我们再使用 docker inspect jenkins-demo 查看数据卷挂载情况和我们希望的一样了 最后还有一点可以注意在指定 容器内路径 时必须使用绝对路径即如果如下写法
# -v 挂载时将 /app.jar 修改为 app.jar
docker run -dp 8859:8859 \
--name jenkins-demo \
-v ./jenkins-0.0.1-SNAPSHOT.jar:app.jar \
openjdk:11 \
java -jar /app.jar会报错invalid mount config for type “bind”: invalid mount path: ‘app.jar’ mount path must be absolute.