Docker容器启动失败:entrypoint.sh未在$PATH中找到的问题求助
解决Docker容器启动时
entrypoint.sh找不到的问题 你的问题核心在于容器内根本不存在entrypoint.sh文件,就算文件存在,直接用相对路径调用也可能因为不在用户$PATH中导致找不到。结合你的目录结构和Dockerfile,我来一步步帮你修复:
问题根源
你本地根目录确实有entrypoint.sh,但在Dockerfile里,你只复制了srcs/和scripts/下的文件到容器的/hermes-app/,完全没把根目录的entrypoint.sh复制进去。另外,就算后续补上复制操作,直接写entrypoint.sh的话,系统会去$PATH定义的目录里查找,而/hermes-app可能不在moderator用户的$PATH配置中,同样会触发找不到的错误。
具体修复步骤
1. 把本地的entrypoint.sh复制到容器中
在Dockerfile里找到复制srcs/的代码块,之后新增复制entrypoint.sh的命令:
COPY srcs/ /hermes-app/ COPY entrypoint.sh /hermes-app/ # 新增:把本地根目录的entrypoint.sh复制到容器工作区 COPY scripts/rvm.sh /hermes-app/rvm.sh COPY scripts/gems.sh /hermes-app/gems.sh
2. 给容器内的entrypoint.sh添加可执行权限
和你处理rvm.sh、gems.sh的逻辑一致,给entrypoint.sh加上执行权限:
RUN chmod +x /hermes-app/rvm.sh RUN chmod +x /hermes-app/gems.sh RUN chmod +x /hermes-app/entrypoint.sh # 新增:赋予脚本执行权限
3. 修改ENTRYPOINT使用绝对路径调用
因为你切换到了moderator用户,/hermes-app大概率不在其默认$PATH里,直接用绝对路径调用脚本更稳妥:
ENTRYPOINT [ "/hermes-app/entrypoint.sh" ]
或者你也可以利用已经设置的WORKDIR /hermes-app,用相对路径:
ENTRYPOINT [ "./entrypoint.sh" ]
额外检查:确保entrypoint.sh有正确的shebang
打开你本地的entrypoint.sh,第一行必须声明脚本解释器,比如:
#!/bin/bash
如果用sh环境的话也可以写成:
#!/bin/sh
没有这一行的话,就算有执行权限,容器也不知道该用什么程序来运行这个脚本。
修改后的关键Dockerfile片段
... # 在容器中创建工作区 RUN mkdir -p /hermes-app && \ chmod -R 777 /hermes-app COPY srcs/ /hermes-app/ COPY entrypoint.sh /hermes-app/ # 新增复制命令 COPY scripts/rvm.sh /hermes-app/rvm.sh COPY scripts/gems.sh /hermes-app/gems.sh RUN chmod +x /hermes-app/rvm.sh RUN chmod +x /hermes-app/gems.sh RUN chmod +x /hermes-app/entrypoint.sh # 新增赋予执行权限 ... WORKDIR /hermes-app RUN useradd -m -s /bin/bash moderator USER moderator RUN echo "source /usr/local/rvm/scripts/rvm" >> ~/.bashrc ENTRYPOINT [ "/hermes-app/entrypoint.sh" ] # 修改为绝对路径调用
做完这些修改后,重新构建镜像并启动容器,应该就能正常找到并执行entrypoint.sh了。
内容的提问来源于stack exchange,提问作者user19144229
相关产品推荐
相关产品推荐

