Docker Error Invalid or corrupt jarfile .jar

来源:互联网 发布:c语言简单编程 编辑:程序博客网 时间:2024/06/11 18:36

零、问题描述

开发环境:Windows8.1

项目:Java Spring Boot 项目

Docker 环境:Docker Toolbox。不是 Windows10,用不了 Docker for Windows 只能用这个。

使用 Docker Compose 编排服务,并启动 Mysql 和 Spring Boot 项目。

docker-compose.yml 文件内容:

version: '2'services:  mysql:    build: ./docker/builds/mysql    ports:      - "3386:3306"    volumes:      - "./docker/data/mysql/data:/var/lib/mysql"      - "./docker/data/mysql/conf:/etc/mysql/conf.d"    restart: always    environment:      MYSQL_DATABASE: testdb      MYSQL_USER: kinginblue      MYSQL_PASSWORD: kinginblue      MYSQL_ROOT_PASSWORD: kinginblue  api:    depends_on:      - mysql    build: ./docker/builds/api    ports:      - "8088:8080"    volumes:      - "./api/target/api-0.0.1-SNAPSHOT.jar:/app/api.jar"    entrypoint:      - "java"      - "-jar"      - "/app/api.jar"    restart: always

然而,docker-compose builddocker-compose up -d 启动之后,docker-compose logs -f api 查看日志,发现错误提示如下:

Error: Invalid or corrupt jarfile /app/api.jar

提示 Jar 包无效或损坏。

一、解决方案

经查,并不是 Jar 包无效或损坏。而是 Windows 的锅。同样的 jar 包同样的 docker-compose.yml 在服务器上的 CentOS 下是没有问题的!

因为我的项目是在 D:\IdeaWorkspace\ 下,是 Windows volumes 挂载出了问题!

虽然我的是 Windows8.1 的 Docker Toolbox,经测,Docker for Mac 也会出现同样的问题!

Docker Compose Get started Tip > Shared folders, volumes, and bind mounts 一节有提到:Docker Engine 会自动挂载用户目录 C:\Users (Windows) or /Users (Mac)。

然而,自己手动挂载非用户目录下的文件,就会出现这种问题!Windows 和 Mac 会出问题,CentOS 不会

解决方法就是不深究了:以前项目都放 D 盘,现在要用 Docker 跑的都放 C 盘的用户目录下了,真是专治各种不服。

我另外一篇博客,也是讲的类似的问题,Windows 下的 Docker 挂载 Mysql 配置文件导致 Mysql 配置文件不生效的问题:Docker mysql [Warning] World-writable config file ‘.cnf’ is is ignored

附、参考资料

  • Docker Compose Get started Tip > Shared folders, volumes, and bind mounts
阅读全文
0 0