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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:04:08