如何通过Bash脚本自动化修改Docker容器内的密码?
问题分析与解决
脚本错误原因
第一种脚本问题
- 变量赋值语法错误:
a = date...中等号两侧不能有空格,Bash变量赋值必须写成变量名=$(命令)的形式,否则会被识别为命令执行。 - Docker命令执行方式错误:
docker exec要执行容器内命令时,必须用bash -c "命令串",直接写bash 'echo cd /'会让bash把字符串当作脚本文件查找,导致"找不到文件"的错误。 - 命令执行环境错误:
htpasswd命令在宿主机执行,但实际需要操作容器内的user.passwd文件,路径和环境都不匹配。
第二种脚本问题
docker exec -u 0 -it c1 bash会进入容器的交互式终端,脚本会暂停在此处,后续所有命令只有在你退出容器后才会在宿主机执行,完全无法完成容器内的操作。
正确脚本实现
# 1. 重启容器 docker restart c1 # 2. 生成32位随机密码,注意变量赋值无空格 PASSWORD=$(date +%s | sha256sum | base64 | head -c 32) # 3. 一次性在容器内执行切换目录+修改密码操作 # -u 0 以root身份执行 # bash -c "命令串" 传递要执行的容器内命令 # echo 密码 | htpasswd -B - - 从标准输入读取密码,避免明文暴露 docker exec -u 0 c1 bash -c "cd / && echo '$PASSWORD' | htpasswd -B - user.passwd webdav"
细节说明
- 如果
user.passwd文件不存在,需要添加-c参数创建文件:docker exec -u 0 c1 bash -c "cd / && echo '$PASSWORD' | htpasswd -B -c - user.passwd webdav" -B参数使用bcrypt加密密码,比默认加密方式更安全- 去掉
-it参数,因为脚本是非交互式执行,避免终端交互冲突
内容的提问来源于stack exchange,提问作者Erling Haaland
相关产品推荐
相关产品推荐

