零、问题描述
开发环境: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 build
和 docker-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