Docker Error Invalid or corrupt jarfile .jar

零、问题描述

开发环境: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

你可能感兴趣的:(Docker,疑难杂症)