Docker停止/启动重置为初始密码
我刚开始使用docker,从github复制粘贴预先制作的回购协议 以下是场景和步骤:Docker停止/启动重置为初始密码,docker,dockerfile,Docker,Dockerfile,我刚开始使用docker,从github复制粘贴预先制作的回购协议 以下是场景和步骤: 我通过环境变量-e传递了mysql/shell根密码,这些密码在entry.sh中按预期设置 然后我进入容器并将shell/mysql根密码重置为其他密码 现在的主要问题是,每次我从主机执行docker stop+start操作时,它都会将密码重置为步骤1的初始密码 请建议更改,以便即使我执行docker启动/停止操作,也能保留修改后的step2密码 可以从此github repo中检查已使用和脚本 谢
谢谢。我刚刚注意到
条目.sh
总是在docker start
上用$MYSQL\u RANDOM\u root\u password
更新根密码。因此,假设我们已经在主机中持久化了/var/lib/mysql
,我们可以稍微编辑条目.sh
以仅在/var/lib/mysql
不存在时更新密码:
#!/bin/sh
# start apache
echo "Starting httpd"
httpd
echo "Done httpd"
# check if mysql data directory is nuked
# if so, install the db
echo "Checking /var/lib/mysql folder"
if [ ! -f /var/lib/mysql/ibdata1 ]; then
echo "Installing db"
mariadb-install-db --user=mysql --ldata=/var/lib/mysql > /dev/null
echo "Installed"
# from mysql official docker repo
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
echo >&2 'error: database is uninitialized and password option is not specified '
echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORD'
exit 1
fi
# random password
if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
echo "Using random password"
MYSQL_ROOT_PASSWORD="$(pwgen -1 32)"
echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"
echo "Done"
fi
tfile=`mktemp`
if [ ! -f "$tfile" ]; then
return 1
fi
cat << EOF > $tfile
USE mysql;
DELETE FROM user;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY "$MYSQL_ROOT_PASSWORD" WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
UPDATE user SET password=PASSWORD("") WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;
EOF
echo "Querying user"
/usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile
rm -f $tfile
echo "Done query"
# setting ssh root password
if [ -z "$SSH_ROOT_PASSWORD" ]; then
echo >&2 'You need to specify SSH_ROOT_PASSWORD'
exit
fi
# Set root password to root, format is 'user:password'.
echo "root:$SSH_ROOT_PASSWORD" | chpasswd
fi;
echo "Generating ssh keys"
if [ ! -f "/etc/ssh/ssh_host_rsa_key" ]; then
# generate fresh rsa key
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
fi
if [ ! -f "/etc/ssh/ssh_host_dsa_key" ]; then
# generate fresh dsa key
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
fi
#prepare run dir
if [ ! -d "/var/run/sshd" ]; then
mkdir -p /var/run/sshd
fi
ssh-keygen -A
/usr/sbin/sshd
# start mysql
# nohup mysqld_safe --skip-grant-tables --bind-address 0.0.0.0 --user mysql > /dev/null 2>&1 &
echo "Starting mariadb database"
exec /usr/bin/mysqld --user=root --bind-address=0.0.0.0
#/垃圾箱/垃圾箱
#启动apache
echo“启动httpd”
httpd
echo“完成httpd”
#检查mysql数据目录是否被核化
#如果是,请安装数据库
echo“检查/var/lib/mysql文件夹”
if[!-f/var/lib/mysql/ibdata1];然后
echo“安装数据库”
mariadb安装db--user=mysql--ldata=/var/lib/mysql>/dev/null
echo“已安装”
#来自mysql官方docker repo
如果[-z“$MYSQL\u ROOT\u PASSWORD”-a-z“$MYSQL\u RANDOM\u ROOT\u PASSWORD”];然后
echo>&2'错误:数据库未初始化,未指定密码选项'
echo>&2'您需要指定MYSQL\u ROOT\u密码、MYSQL\u RANDOM\u ROOT\u密码中的一个'
出口1
fi
#随机密码
如果[!-z“$MYSQL\u RANDOM\u ROOT\u PASSWORD”];然后
回显“使用随机密码”
MYSQL_ROOT_PASSWORD=“$(pwgen-1 32)”
echo“生成的根密码:$MYSQL\u根密码”
回音“完成”
fi
tfile=`mktemp`
如果[!-f“$t文件”];然后
返回1
fi
cat$t文件
使用mysql;
从用户中删除;
同花顺特权;
使用GRANT选项将**上的所有权限授予“$MYSQL\u root\u PASSWORD”标识的“root”@“%”;
使用GRANT选项将**上的所有权限授予“根”@“本地主机”;
更新用户设置密码=密码(“”),其中user='root'和host='localhost';
同花顺特权;
EOF
回显“查询用户”
/usr/bin/mysqld--user=root--bootstrap--verbose=0<$t文件
rm-f$t文件
回显“完成查询”
#设置ssh根密码
如果[-z“$SSH_ROOT_PASSWORD”];然后
echo>&2“您需要指定SSH\u ROOT\u密码”
出口
fi
#将root密码设置为root,格式为“user:password”。
echo“root:$SSH_root_PASSWORD”| chpasswd
fi;
echo“生成ssh密钥”
如果[!-f”/etc/ssh/ssh_主机_rsa_密钥”];然后
#生成新的rsa密钥
ssh-keygen-f/etc/ssh/ssh\u主机\u rsa\u密钥-N''-t rsa
fi
如果[!-f”/etc/ssh/ssh_host_dsa_key”];然后
#生成新的dsa密钥
ssh-keygen-f/etc/ssh/ssh\u主机\u dsa\u密钥-N''-t dsa
fi
#准备运行目录
如果[!-d”/var/run/sshd“];然后
mkdir-p/var/run/sshd
fi
ssh-keygen-A
/usr/sbin/sshd
#启动mysql
#nohup mysqld_safe--跳过授权表--绑定地址0.0.0.0--用户mysql>/dev/null 2>&1&
echo“启动mariadb数据库”
exec/usr/bin/mysqld--user=root--bind address=0.0.0
基本上,我们只需移动到它上面的if块我认为您可以通过在启动容器时使用
--volume
选项将mysql配置和数据绑定到外部路径来保持更改。检查这篇文章,谢谢,但它没有帮助。卷无法帮助停止重置外壳根密码。可能在使用entry.sh和dockerfile时缺少了一些东西。哦,是的,关于entry.sh你是对的。在这种情况下,我们可以尝试对其进行一些编辑,以避免在docker start
上更新密码。下面是我的答案,非常简单,谢谢指点。