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

