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

Docker镜像无法定位entrypoint.sh脚本问题排查求助

自定义Sauce Connect镜像Entrypoint问题排查与修复

问题背景

尝试基于saucelabs/sauce-connect:5.2.0构建自定义Docker镜像,添加自定义entrypoint.sh脚本实现启动前打印信息并启动Sauce Connect,但运行容器时提示exec /entrypoint.sh: no such file or directory,且最终镜像中不存在该脚本。

现有配置

Dockerfile

# Stage 1: Prepare the entrypoint script
FROM alpine:3.17 as builder
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Stage 2: Use Sauce Connect as the base image
FROM saucelabs/sauce-connect:5.2.0
COPY --from=builder /entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh(简化版)

#!/bin/sh
echo "Starting Sauce Connect Proxy..."

构建与运行命令

构建:

docker build -t sauce-connect-custom .

运行:

docker run \
  -e SAUCE_USERNAME="my-username" \
  -e SAUCE_ACCESS_KEY="my-access-key" \
  -e SAUCE_TUNNEL_NAME="my-tunnel" \
  -e SAUCE_REGION="us-west" \
  -it sauce-connect-custom

已尝试操作

  • 确认entrypoint.sh与Dockerfile在同一目录
  • 验证脚本权限为可执行(-rwxr-xr-x)
  • 使用--no-cache参数重新构建
  • 进入容器确认脚本未被复制到最终镜像

排查与修复建议

1. 简化Dockerfile,跳过Builder阶段

轻量级基础镜像可能与Alpine镜像的文件系统存在兼容性,导致跨阶段COPY失败。直接从构建上下文复制脚本到目标镜像:

FROM saucelabs/sauce-connect:5.2.0
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

2. 适配基础镜像的Shell环境

部分轻量级镜像可能没有/bin/sh或使用其他Shell路径,先确认基础镜像的Shell位置:

docker run --rm saucelabs/sauce-connect:5.2.0 which sh

根据输出修改entrypoint.sh的shebang行,比如输出为/usr/bin/sh时,脚本第一行改为#!/usr/bin/sh。

3. 验证COPY阶段的正确性

在Dockerfile中添加验证步骤,确认脚本复制成功:

FROM saucelabs/sauce-connect:5.2.0
COPY entrypoint.sh /entrypoint.sh
RUN ls -l /entrypoint.sh && chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

若构建时ls命令提示文件不存在,检查:

  • .dockerignore是否排除了entrypoint.sh
  • 构建命令是否在Dockerfile所在目录执行(确保上下文路径正确)

4. 修复脚本换行符格式

Windows环境编写的脚本可能带有CRLF换行符,Linux容器无法识别。可通过以下方式修复:

  • 使用VS Code等编辑器将文件格式改为LF
  • 在构建时添加转换步骤:

FROM saucelabs/sauce-connect:5.2.0
COPY entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r$//' /entrypoint.sh && chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

### 5. 继承原镜像的启动逻辑
自定义Entrypoint需要调用原镜像的启动命令,否则Sauce Connect无法正常启动。先查看原镜像的默认命令:
```bash
docker inspect --format='{{.Config.Entrypoint}} {{.Config.Cmd}}' saucelabs/sauce-connect:5.2.0

修改entrypoint.sh,在打印信息后执行原命令,例如:

#!/bin/sh
echo "Starting Sauce Connect Proxy..."
exec sauce-connect "$@"

内容的提问来源于stack exchange,提问作者Casey Cling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:03:14