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

Docker Compose部署Ubuntu服务器报错:无法准备上下文路径

问题:Docker Compose部署到Ubuntu服务器时构建上下文错误

在Windows/WSL环境中运行正常的Docker Compose文件,部署到Ubuntu服务器时出现以下错误:

unable to prepare context: path "/home/dev/gestion_energetique/portainer/node_red/docker-alpine.sh"

该镜像原本通过docker-alpine.sh脚本构建,文件存在且已设置777权限,查阅类似问题后未解决,推测问题出在该.sh脚本但不知如何排查。

相关文件内容

Docker Compose文件

services:
  nodered:
    container_name: nodered
    image: testing:node-red-build
    build: /home/dev/gestion_energetique/portainer/node_red/docker-alpine.sh
    restart: always
    ports:
      - 1880:1880
    # volumes:
    #   - ~/node_red/:/data/
  influxdb:
    container_name: influxdb
    image: influxdb:latest
    restart: always
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup 
      - DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_USERNAME}
      - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_PASSWORD}
      - DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_ORG}
      - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_BUCKET}
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_TOKEN}
    volumes:
      - /home/dev/gestion_energetique/portainer/data:/var/lib/influxdb2
      - /home/dev/gestion_energetique/portainer/config/influxdb:/etc/influxdb2
    ports:
      - 8086:8086
    depends_on:
      - nodered
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: always
    ports:
      - 3000:3000
    volumes:
      - /home/dev/gestion_energetique/portainer/data/grafana:/var/lib/grafana
      - /home/dev/gestion_energetique/portainer/config/grafana:/etc/grafana
    depends_on:
      - influxdb
  ihm:
    container_name: ihm
    build: /home/dev/gestion_energetique/portainer/.
    restart: always
    ports:
      - 1312:1312
    depends_on:
      - influxdb

docker-alpine.sh脚本

#!/bin/bash
export NODE_RED_VERSION=$(grep -oE "\"node-red\": \"(\w*.\w*.\w*.\w*.\w*.)" package.json | cut -d\" -f4)

echo "#########################################################################"
echo "node-red version: ${NODE_RED_VERSION}"
echo "#########################################################################"

docker build --rm --no-cache \
    --build-arg ARCH=amd64 \
    --build-arg NODE_VERSION=20 \
    --build-arg NODE_RED_VERSION=${NODE_RED_VERSION} \
    --build-arg OS=alpine \
    --build-arg BUILD_DATE="$(date +"%Y-%m-%dT%H:%M:%SZ")" \
    --build-arg TAG_SUFFIX=default \
    --file Dockerfile.custom \
    --tag testing:node-red-build .

解决方案

核心问题定位

Docker Compose的build字段要求指定构建上下文目录,而非直接指向shell脚本。你当前的配置把脚本路径传给build,导致Docker尝试将该脚本作为上下文目录处理,因此报错。

修复步骤

  1. 调整Docker Compose配置
    有两种可行方案:

    • 方案一:先手动执行脚本构建镜像,再修改Compose文件移除build字段(镜像已存在):

      cd /home/dev/gestion_energetique/portainer/node_red
      chmod +x docker-alpine.sh
      ./docker-alpine.sh
      

      修改后的nodered服务配置:

      nodered:
        container_name: nodered
        image: testing:node-red-build
        restart: always
        ports:
          - 1880:1880
        # volumes:
        #   - ~/node_red/:/data/
      
    • 方案二:将脚本中的构建参数直接整合到Compose的build配置中,替代脚本:
      确保/home/dev/gestion_energetique/portainer/node_red目录下存在Dockerfile.custom,然后修改Compose:

      nodered:
        container_name: nodered
        image: testing:node-red-build
        build:
          context: /home/dev/gestion_energetique/portainer/node_red
          dockerfile: Dockerfile.custom
          args:
            ARCH: amd64
            NODE_VERSION: 20
            NODE_RED_VERSION: # 可手动指定版本,或通过.env文件传递
            OS: alpine
            BUILD_DATE: "${BUILD_DATE:-$(date +"%Y-%m-%dT%H:%M:%SZ")}"
            TAG_SUFFIX: default
          no_cache: true
        restart: always
        ports:
          - 1880:1880
        # volumes:
        #   - ~/node_red/:/data/
      

      若需动态获取NODE_RED_VERSION,可在执行docker-compose up前通过脚本提取版本到环境变量,或使用env_file加载。

  2. 脚本兼容性检查

    • 确认Ubuntu服务器上的grep支持-oE参数(GNU grep默认支持,BusyBox grep可能有差异),执行grep --version验证。
    • 确保package.json位于脚本执行的当前目录(/home/dev/gestion_energetique/portainer/node_red),否则grep会找不到文件。
  3. 权限优化
    无需设置777权限,执行chmod +x docker-alpine.sh赋予执行权限即可,更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:23:20