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
相关产品推荐
相关产品推荐

