Docker停止/启动重置为初始密码

Docker停止/启动重置为初始密码,docker,dockerfile,Docker,Dockerfile,我刚开始使用docker,从github复制粘贴预先制作的回购协议 以下是场景和步骤: 我通过环境变量-e传递了mysql/shell根密码,这些密码在entry.sh中按预期设置 然后我进入容器并将shell/mysql根密码重置为其他密码 现在的主要问题是,每次我从主机执行docker stop+start操作时,它都会将密码重置为步骤1的初始密码 请建议更改,以便即使我执行docker启动/停止操作,也能保留修改后的step2密码 可以从此github repo中检查已使用和脚本 谢

我刚开始使用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
    上更新密码。下面是我的答案,非常简单,谢谢指点。