'Why does my mysql container initialization database intermittently fail

I used the following dockerfile to build the centos7-based mysql service, but occasionally failed to change the initialization password when I tried to start it

ARG OS_VER=7


FROM centos:$OS_VER

ARG MYSQL_DATA_DIR=/data/mysql

ARG MYSQL_PID_DIR=/var/run/mysql

ARG MYSQL_LOG_DIR=/var/log/mysql

ARG MYSQL_SOCK_DIR=/var/lib/mysql

RUN cd /usr/src \
    && curl -o mysql.tar.gz https://dev.mysql.com/get/Downloads/MySQL-${MYSQL_VER%.*}/mysql-boost-${MYSQL_VER}.tar.gz -L \
    && tar zxf mysql.tar.gz \
    && cd mysql-${MYSQL_VER} \
    && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_BOOST=./boost -DMYSQL_DATADIR=${MYSQL_DATA_DIR} -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 \
        -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=${MYSQL_SOCK_DIR}/mysql.sock -DMYSQL_TCP_PORT=3306 \
        -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_UNIT_TESTS=OFF \
    && gmake \
    && gmake install \
    && mkdir -p ${MYSQL_DATA_DIR} \
    && mkdir -m 755 -p ${MYSQL_LOG_DIR} \
    && mkdir -m 755 -p ${MYSQL_SOCK_DIR} \
    && mkdir -m 755 -p ${MYSQL_PID_DIR} \
    && echo -e "[mysqld]\ndatadir=${MYSQL_DATA_DIR}\nsocket=${MYSQL_SOCK_DIR}/mysql.sock\nsymbolic-links=0\nlog-error=${MYSQL_LOG_DIR}/mysqld.log\npid-file=${MYSQL_PID_DIR}/mysqld.pid\nuser=root\n" > /etc/my.cnf \
    && echo -e "#!/bin/sh \n\
        files=\`ls ${MYSQL_DATA_DIR}\` \n\
        if [ -z \"\$files\" ];then \n\
            if [ ! \${MYSQL_PASSWORD} ]; then \n\
                MYSQL_PASSWORD='123456' \n\
            fi \n\
            /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=${MYSQL_DATA_DIR} > ${MYSQL_LOG_DIR}/mysqld.log 2>&1 \n\
            MYSQLOLDPASSWORD=\`awk -F \"localhost: \" '/A temporary/{print \$2}' ${MYSQL_LOG_DIR}/mysqld.log\` \n\
            /usr/local/mysql/bin/mysqld & \n\
            echo -e \"[client] \\\n  password=\"\${MYSQLOLDPASSWORD}\" \\\n user=root\" > ~/.my.cnf \n\
            sleep 8s \n\
            /usr/local/mysql/bin/mysql --connect-expired-password -e \"alter user 'root'@'localhost' identified by '\$MYSQL_PASSWORD';update mysql.user set host='%' where user='root' && host='localhost';flush privileges;\" \n\
            echo -e \"[client] \\\n  password=\"\${MYSQL_PASSWORD}\" \\\n user=root\" > ~/.my.cnf \n\
            while true \n\
            do \n\
              let \"1\" \n\
            done \n\
        else \n\
            rm -rf \${MYSQL_SOCK_DIR}/mysql.sock.lock \n\
            /usr/local/mysql/bin/mysqld \n\
        fi" > /mysql.sh \
    && chmod +x /mysql.sh \
    && sed -i "s/export PATH/PATH=\/usr\/local\/mysql\/bin:\$PATH\nexport PATH/" /etc/profile \
    && rm -rf /usr/src/mysql.tar.gz && rm -rf /usr/src/mysql-${MYSQL_VER} && rm -rf /usr/local/mysql/mysql-test \
    && rm -rf /usr/local/mysql/bin/mysql_client_test && rm -rf /usr/local/mysql/bin/mysql_client_test_embedded && rm -rf /usr/local/mysql/bin/mysql_embedded \
    && rm -rf /usr/local/mysql/bin/mysqltest && rm -rf /usr/local/mysql/bin/mysqltest_embedded && rm -rf /usr/local/mysql/lib/libmysql.a

EXPOSE 3306

CMD ["sh", "mysql.sh"]

The mysql.sh in the final container looks like this

cat /mysql.sh
#!/bin/sh
        files=`ls /data/mysql`
        if [ -z "$files" ];then
            if [ ! ${MYSQL_PASSWORD} ]; then
                MYSQL_PASSWORD='123456'
            fi
            /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql > /var/log/mysql/mysqld.log 2>&1
            MYSQLOLDPASSWORD=`awk -F "localhost: " '/A temporary/{print $2}' /var/log/mysql/mysqld.log`
            /usr/local/mysql/bin/mysqld &
            echo -e "[client] \n  password="${MYSQLOLDPASSWORD}" \n user=root" > ~/.my.cnf
            sleep 8s
            /usr/local/mysql/bin/mysql --connect-expired-password -e "alter user 'root'@'localhost' identified by '$MYSQL_PASSWORD';update mysql.user set host='%' where user='root' && host='localhost';flush privileges;"
            echo -e "[client] \n  password="${MYSQL_PASSWORD}" \n user=root" > ~/.my.cnf
            while true
            do
              let "1"
            done
        else
            rm -rf ${MYSQL_SOCK_DIR}/mysql.sock.lock
            /usr/local/mysql/bin/mysqld
        fi

After several attempts to deploy the container, the following error occasionally occurs

mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

I get the initial password login through the log via cat /var/log/mysql/mysqld.log, and then execute any command and get the following error

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

After this, execute subsequent alter, update and flush commands, I can log in with the configured new password (123456)

I want to know what causes this contingency and how to solve it

I really appreciate any help with this.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source