Docker容器中脚本执行cp命令无法复制配置文件求助
问题排查与解决
核心问题分析
你遇到的情况大概率是Windows下的CRLF换行符导致Shell脚本执行异常,或者脚本缺少执行权限。
原因1:Windows换行符(CRLF)不兼容Alpine Linux
Windows系统默认用CRLF(\r\n)作为换行符,而Alpine Linux这类Unix系统用LF(\n)。当start.sh带着CRLF换行符被复制到容器里,执行时会把\r当成命令的一部分,导致cp命令的路径解析错误,自然无法完成复制操作。
原因2:start.sh缺少执行权限
Docker从Windows复制文件时,可能会丢失文件的执行权限,导致容器启动时无法正常执行脚本(虽然你手动执行没问题,但手动执行时可能用了sh start.sh绕开了权限检查)。
具体修复步骤
1. 修正start.sh的换行符为LF
- 在VS Code里打开start.sh,点击右下角状态栏的
CRLF,切换选择LF - 或者用Git命令全局配置自动转换:
git config --global core.autocrlf input,重新提交脚本确保后续文件都是LF格式
2. 在Dockerfile中添加执行权限设置
修改Dockerfile,给start.sh添加可执行权限:
FROM nginx:1.23-alpine as application WORKDIR /build COPY configuration configuration COPY start.sh start.sh # 赋予脚本执行权限 RUN chmod +x start.sh ENTRYPOINT /build/start.sh
3. 可选:添加调试输出验证环境变量
在start.sh里加一行调试代码,确认环境变量是否正确传递:
echo "当前部署环境:${DEPLOYMENT_ENVIRONMENT}" cp configuration/${DEPLOYMENT_ENVIRONMENT}/custom.configuration.conf /etc/nginx/conf.d nginx -g "daemon off;"
启动容器后查看日志:docker logs <容器ID>,就能确认环境变量是否正常加载。
验证修复
重新构建镜像并运行:
docker build -t custom-nginx . docker run -e DEPLOYMENT_ENVIRONMENT=qa -p 8080:80 custom-nginx
再用docker exec进入容器检查/etc/nginx/conf.d路径,配置文件应该已成功复制。
内容的提问来源于stack exchange,提问作者Rama Rahul
相关产品推荐
相关产品推荐

