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尝试将该脚本作为上下文目录处理,因此报错。
修复步骤
调整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加载。
脚本兼容性检查
- 确认Ubuntu服务器上的
grep支持-oE参数(GNU grep默认支持,BusyBox grep可能有差异),执行grep --version验证。 - 确保
package.json位于脚本执行的当前目录(/home/dev/gestion_energetique/portainer/node_red),否则grep会找不到文件。
- 确认Ubuntu服务器上的
权限优化
无需设置777权限,执行chmod +x docker-alpine.sh赋予执行权限即可,更安全。
内容的提问来源于stack exchange,提问作者The Governor
相关产品推荐
相关产品推荐

