'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 |
|---|
