You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下Docker挂载卷异常:SpringBoot容器文件无法同步至本地

问题描述

我正在开发基于SpringBoot和Docker的项目,尝试通过挂载卷让本地目录访问SpringBoot应用在容器内生成的文件。目前文件已在Docker容器中生成,但无法在本地目录找到对应内容。

我查阅了许多相关资料,但都未能解决问题。作为Docker新手,恳请各位提供解决建议。

我尝试直接在Dockerfile中挂载卷,同时使用docker-compose文件启动该服务及其他关联服务,以下是我的Dockerfile和docker-compose配置内容:

Dockerfile

FROM iron/java:1.8
EXPOSE 8080

ENV USER_NAME myprofile
ENV APP_HOME /home/$USER_NAME/app
#Test Script>>>>>>>>>>>>>>>>>>>>>>
#Modifiable
ENV SQL_SCRIPT $APP_HOME/SCRIPTS_TO_RUN
ENV SQL_OUTPUT_FILE $SQL_SCRIPT/data
ENV NO_OF_USERS 3
ENV RANGE_OF_SKILLS "1-4"
ENV HOST_PATH C:"/Users/user1/IdeaProjects/path/logs"
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RUN adduser -S $USER_NAME
RUN mkdir $APP_HOME
RUN mkdir $SQL_SCRIPT
RUN chown $USER_NAME $SQL_SCRIPT
VOLUME $HOST_PATH: $SQL_SCRIPT
ADD myprofile-*.jar $APP_HOME/myprofile.jar
RUN chown $USER_NAME $APP_HOME/myprofile.jar

USER $USER_NAME
WORKDIR $APP_HOME
RUN sh -c 'touch myprofile.jar'

ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom -jar myprofile.jar -o $SQL_OUTPUT_FILE -n $NO_OF_USERS -r $RANGE_OF_SKILLS"]

Docker-compose

myprofile-backend:
  extra_hosts:
    - remotehost
  container_name: samplecontainer-name
  image: sampleimagename
  links:
    - rabbitmq
    - db:redis
  expose:
    - "8080"
  ports:
    - "8082:8080"
  volumes:
    - ./logs/:/tmp/logs
    - ./logs/:/app

解决建议

1. 移除Dockerfile中的错误VOLUME指令

Dockerfile里的VOLUME $HOST_PATH: $SQL_SCRIPT写法完全错误:VOLUME指令仅能定义容器内的路径,不能指定宿主机路径,且语法格式不符合规范。该指令会导致挂载逻辑混乱,直接删除即可。

2. 对齐文件生成路径与挂载路径

你的SpringBoot应用生成的文件存放在容器内的/home/myprofile/app/SCRIPTS_TO_RUN/data,但当前docker-compose挂载的./logs/:/tmp/logs和./logs/:/app完全没对应到文件生成目录。需要把挂载目标修改为容器内的文件生成根目录。

3. 修正docker-compose的volumes配置

修改后的volumes部分应如下,确保本地./logs目录与容器内文件生成目录绑定:

volumes:
  - ./logs/:/home/myprofile/app/SCRIPTS_TO_RUN

4. 检查路径权限

容器内的/home/myprofile/app/SCRIPTS_TO_RUN已设置myprofile用户权限,挂载后需确保本地./logs目录允许容器写入。如果是Linux/macOS环境,可执行以下命令临时开放权限:

chmod 777 ./logs

5. 验证挂载有效性

启动容器后,通过以下命令确认文件同步情况:

# 进入容器查看生成的文件
docker exec -it samplecontainer-name /bin/sh
ls /home/myprofile/app/SCRIPTS_TO_RUN

# 退出容器后查看本地目录
ls ./logs

修正后的完整配置

Dockerfile(移除错误指令)

FROM iron/java:1.8
EXPOSE 8080

ENV USER_NAME myprofile
ENV APP_HOME /home/$USER_NAME/app
#Test Script>>>>>>>>>>>>>>>>>>>>>>
#Modifiable
ENV SQL_SCRIPT $APP_HOME/SCRIPTS_TO_RUN
ENV SQL_OUTPUT_FILE $SQL_SCRIPT/data
ENV NO_OF_USERS 3
ENV RANGE_OF_SKILLS "1-4"
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RUN adduser -S $USER_NAME
RUN mkdir $APP_HOME
RUN mkdir $SQL_SCRIPT
RUN chown $USER_NAME $SQL_SCRIPT
ADD myprofile-*.jar $APP_HOME/myprofile.jar
RUN chown $USER_NAME $APP_HOME/myprofile.jar

USER $USER_NAME
WORKDIR $APP_HOME
RUN sh -c 'touch myprofile.jar'

ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom -jar myprofile.jar -o $SQL_OUTPUT_FILE -n $NO_OF_USERS -r $RANGE_OF_SKILLS"]

docker-compose.yml(修正挂载路径)

myprofile-backend:
  extra_hosts:
    - remotehost
  container_name: samplecontainer-name
  image: sampleimagename
  links:
    - rabbitmq
    - db:redis
  expose:
    - "8080"
  ports:
    - "8082:8080"
  volumes:
    - ./logs/:/home/myprofile/app/SCRIPTS_TO_RUN

内容的提问来源于stack exchange,提问作者Darotudeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:25:51