【问题标题】:How to set mysql username in dockerfile如何在dockerfile中设置mysql用户名
【发布时间】:2015-11-15 17:07:03
【问题描述】:

在ubuntu中使用apt-get install mysql-server安装mysql时,安装时会询问mysql用户名和密码。

但是在使用dockerfile构建mysql镜像的时候,用户名和密码怎么提供呢?

我尝试使用 dockerfile 如下:

FROM ubuntu:14.04
apt-get update
apt-get install -y mysql-server

但是在构建镜像的时候,我发现不用用户名和密码就可以登录mysql了。

使用dockerfile构建镜像时如何设置用户名和密码?

【问题讨论】:

    标签: mysql docker dockerfile


    【解决方案1】:

    如果您查看官方 Docker MySQL 镜像Dockerfile,您会发现他们是如何使用debconf-set-selections 做到的。

    相关说明为:

    RUN { \
            echo mysql-community-server mysql-community-server/data-dir select ''; \
            echo mysql-community-server mysql-community-server/root-pass password ''; \
            echo mysql-community-server mysql-community-server/re-root-pass password ''; \
            echo mysql-community-server mysql-community-server/remove-test-db select false; \
        } | debconf-set-selections \
        && apt-get update && apt-get install -y mysql-server
    

    debconf-set-selections 是一个工具,可让您为以后安装过程中提出的问题准备答案。

    【讨论】:

    • 谢谢!我发现这需要额外的一行,如here 所述。一个完整的、经过构建测试的示例是here
    【解决方案2】:

    tutumcloud/mysql

    Dockerfile

    ADD run.sh /run.sh
    
    ENV MYSQL_USER=admin \
        MYSQL_PASS=**Random** \
        ON_CREATE_DB=**False** \
        REPLICATION_MASTER=**False** \
        REPLICATION_SLAVE=**False** \
        REPLICATION_USER=replica \
        REPLICATION_PASS=replica
    

    运行.sh

    StartMySQL ()
    {
        /usr/bin/mysqld_safe ${EXTRA_OPTS} > /dev/null 2>&1 &
        # Time out in 1 minute
        LOOP_LIMIT=60
        for (( i=0 ; ; i++ )); do
            if [ ${i} -eq ${LOOP_LIMIT} ]; then
                echo "Time out. Error log is shown as below:"
                tail -n 100 ${LOG}
                exit 1
            fi
            echo "=> Waiting for confirmation of MySQL service startup, trying ${i}/${LOOP_LIMIT} ..."
            sleep 1
            mysql -uroot -e "status" > /dev/null 2>&1 && break
        done
    }
    CreateMySQLUser()
    {
        if [ "$MYSQL_PASS" = "**Random**" ]; then
            unset MYSQL_PASS
        fi
    
        PASS=${MYSQL_PASS:-$(pwgen -s 12 1)}
        _word=$( [ ${MYSQL_PASS} ] && echo "preset" || echo "random" )
        echo "=> Creating MySQL user ${MYSQL_USER} with ${_word} password"
    
        mysql -uroot -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '$PASS'"
        mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION"
        echo "=> Done!"
        echo "========================================================================"
        echo "You can now connect to this MySQL Server using:"
        echo ""
        echo "    mysql -u$MYSQL_USER -p$PASS -h<host> -P<port>"
        echo ""
        echo "Please remember to change the above password as soon as possible!"
        echo "MySQL user 'root' has no password but only allows local connections"
        echo "========================================================================"
    }
    StartMySQL
    CreateMySQLUser
    

    .....对你有帮助

    【讨论】:

    • 一般来说,mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION"要非常小心
    • 有两个原因。你只是给了他们一切的权利(嗯,这就是你需要的唯一原因)......但也要小心 WITH GRANT OPTION
    猜你喜欢
    • 2016-12-23
    • 2015-10-22
    • 2016-07-23
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多