Docker构建Vault镜像启动时提示run.sh不存在且脚本不执行问题求助
错误原因说明
- 初始报错
/bin/sh: 1: ./run.sh: not found通常由两个问题导致:- run.sh没有可执行权限,系统无法直接运行
- 若你在Windows系统下编写run.sh,文件换行符为Windows格式的CRLF,Ubuntu系统无法识别脚本首行的
#!/bin/bash声明,会将脚本判定为非可执行文件
- 把
CMD ./run.sh替换为RUN chmod +x run.sh后脚本不执行,是因为RUN是镜像构建阶段执行的指令,仅在构建镜像时生效,不会作为容器启动后的运行命令。替换后镜像没有配置默认启动命令,容器启动后会运行Ubuntu基础镜像的默认bash进程,自然不会执行初始化脚本,也不会有对应输出。
具体修复步骤
步骤1:修正Dockerfile配置
修改后的Dockerfile内容如下:
FROM ubuntu:20.04 RUN apt-get update && apt-get install -y software-properties-common curl gnupg2 && \ curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add - && \ apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" && \ apt-get update && apt-get install -y \ vault dos2unix && \ setcap cap_ipc_lock= /usr/bin/vault # 复制脚本到固定目录避免相对路径异常 COPY run.sh /usr/local/bin/ # 转换换行符+授予可执行权限 RUN dos2unix /usr/local/bin/run.sh && chmod +x /usr/local/bin/run.sh # 配置容器启动命令 CMD ["/usr/local/bin/run.sh"]
步骤2:修复run.sh逻辑缺陷
原脚本没有启动Vault服务的步骤,直接执行vault status会一直失败,修改后的脚本如下:
#!/bin/bash # 后台启动开发模式Vault服务,指定对应root token vault server -dev -dev-root-token-id=vault-plaintext-root-token & VAULT_PID=$! VAULT_RETRIES=5 echo "Vault is starting..." until vault status > /dev/null 2>&1 || [ "$VAULT_RETRIES" -eq 0 ]; do echo "Waiting for vault to start...: $((VAULT_RETRIES--))" sleep 1 done echo "Authenticating to vault..." vault login token=vault-plaintext-root-token echo "Initializing vault..." vault secrets enable -version=2 -path=my.secrets kv echo "Adding entries..." vault kv put my.secrets/dev username=test_user vault kv put my.secrets/dev password=test_password echo "Complete..." # 将Vault进程切到前台,避免脚本执行完容器直接退出 wait $VAULT_PID
步骤3:启动容器验证
启动容器时不要加-d后台运行参数,直接执行以下命令即可看到完整的脚本输出:docker run -it <你的镜像名称>
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

