Docker容器内Shell脚本无法读取JSON文件导致POST请求为空的问题求助
解决Data-Loader容器无法读取mydata.json的问题
从你给出的错误信息和配置来看,核心问题是data-loader容器内找不到mydata.json文件,导致curl无法读取数据发起POST请求。下面是具体的排查和修复步骤:
1. 修复Docker Compose的Volumes挂载配置
你的docker-compose.yaml里的volumes仅指定了宿主机的源路径,未映射到容器内的目标路径,文件并没有被挂载到容器的预期位置。
修改volumes部分,明确指定容器内的挂载路径:
data-loader: <<: *my-base-service build: context: . dockerfile: Dockerfile.dataloader args: IMAGE_NAME: <alpine base image> container_name: data-loader volumes: # 将宿主机的mydata.json挂载到容器根目录,和脚本同路径 - $MY_PATH/config/mydata.json:/mydata.json
你也可以选择挂载到专门的目录(比如/data/mydata.json),后续对应调整脚本里的文件路径即可。
2. 确保脚本使用正确的文件路径
如果挂载路径不是容器的当前工作目录(默认是/),需要在dataloader.sh里使用绝对路径引用文件。比如挂载到/data目录的话,脚本要改成:
response=$(curl -X POST "http://myblogcontainer:8080/blog/create" -H "accept: */*" -H "Content-Type: application/json" \ -d @/data/mydata.json) echo ${response}
如果是挂载到/根目录,原脚本的@mydata.json就能正常工作,因为容器默认工作目录是/。
3. 验证环境变量和文件存在性
- 确认
$MY_PATH环境变量在运行docker-compose时已正确设置,你可以通过echo $MY_PATH检查值是否符合预期。 - 确保宿主机上
$MY_PATH/config/mydata.json文件确实存在,且拥有可读权限。
额外优化:容器启动顺序
虽然当前错误是文件问题,但后续可能遇到my-blog-container未就绪的情况。可以在docker-compose里添加depends_on确保data-loader在my-blog-container之后启动,同时在脚本里增加等待逻辑(比如循环检测服务状态):
data-loader: # ... 其他配置 depends_on: - my-blog-container
脚本里的等待逻辑示例:
# 等待my-blog-container服务就绪 until curl -s "http://myblogcontainer:8080/health" > /dev/null; do echo "Waiting for my-blog-container to be ready..." sleep 2 done # 发起POST请求填充数据 response=$(curl -X POST "http://myblogcontainer:8080/blog/create" -H "accept: */*" -H "Content-Type: application/json" \ -d @/mydata.json) echo ${response}
按照以上步骤调整后,应该就能解决文件读取的问题,成功完成数据填充了。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

