Docker Compose启动Spring/MySQL应用时镜像拉取权限被拒问题求助
问题解决步骤
核心错误:镜像标签不匹配
你构建镜像时执行的命令:
docker build -t spring-demo-app.jar .
会生成一个名为spring-demo-app.jar的本地镜像,但你的docker-compose.yml里指定的应用镜像是spring-demo-app:latest,Docker找不到对应标签的本地镜像,就会尝试去Docker Hub拉取公开镜像,进而触发权限拒绝错误。
解决方法:重新构建镜像,使用和docker-compose中一致的标签:
docker build -t spring-demo-app:latest .
其他必须修复的问题
1. MySQL密码未配置
你的docker-compose.yml中MySQL的MYSQL_ROOT_PASSWORD为空,这会导致MySQL容器直接启动失败(MySQL要求必须设置root密码)。需要补充密码:
mysql: image: mysql:latest container_name: mysql_container environment: MYSQL_ROOT_PASSWORD: your_custom_password # 替换为实际密码 MYSQL_DATABASE: karia # 其余配置不变
同时同步修改Spring应用的数据库密码配置:
spring_app: # 其余配置不变 environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/karia SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: your_custom_password # 和MySQL密码保持一致
2. Dockerfile路径一致性问题
你的Dockerfile中:
ADD target/spring-demo-app.jar spring-demo-app.jar ENTRYPOINT ["java","-jar","/spring-demo-app.jar"]
ADD指令将jar包放到容器的当前工作目录,但ENTRYPOINT使用的是绝对路径/spring-demo-app.jar,虽然默认工作目录是/不会出错,但更稳妥的写法是统一路径:
ADD target/spring-demo-app.jar /spring-demo-app.jar ENTRYPOINT ["java","-jar","/spring-demo-app.jar"]
3. Spring应用连接MySQL的时机问题
depends_on仅保证Spring容器在MySQL容器之后启动,但不保证MySQL服务已经完全就绪。Spring启动时可能因数据库未初始化完成而连接失败。可以给MySQL添加健康检查,让docker-compose等待MySQL服务就绪后再启动Spring:
mysql: # 其余配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 spring_app: # 其余配置不变 depends_on: mysql: condition: service_healthy
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

