在 CentOS 7 下,我了解到我们正在从mysql-server
实现兼容的 MariaDB 迁移到。我正在使用 的 docker 镜像centos:latest
,这使我处于 Centos 7 的支持下。
mysqld_safe
在前台运行阻塞。这样就简单了:我只需要 0) 安装包 1) 更改 root 密码和 2) 从Dockerfile
在 docker 范例中,我需要能够像在 bash 脚本中一样安装 MariaDB。我aptitude
在 Ubuntu 下找到了各种方法来执行此操作,但尚未找到等效的答案yum
:如何在 Centos 7 上安装、配置和运行 mariadb,就像通过 Bash 脚本安装一样?mysql_secure_installation
似乎需要 TTY。
我尝试手动运行mysqladmin
密码命令,但它抱怨无法连接到正在运行的 MySQL 实例。由于容器在步骤之间被丢弃,我认为我需要以某种方式运行 mysql 并在同一步骤中更改密码。
我尝试安装initscripts
软件包,/bin/service
但它试图将我重定向到使用systemctl start mariadb.service
,这是不可用的,因为 Docker 容器获取的是fakesystemd
而不是systemd
。有什么想法吗?
这是我当前的 Dockerfile 变体(在这个变体中,尝试让tail -f
进程保持活动状态CMD
)
FROM centos:latest
MAINTAINER Me ([email protected])
RUN yum -y install wget epel-release
RUN cd /usr/local/src && wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && rpm -Uvh remi-*.rpm && rm remi-*.rpm
RUN sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/remi*.repo
RUN cd /usr/local/src && wget http://apt.sw.be/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm && rpm -Uvh rpmforge-*.rpm && rm rpmforge-*.rpm
RUN rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
RUN sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/rpmforge*.repo
RUN yum -y update
RUN yum -y upgrade
# mysql
RUN yum -y install mariadb-server
RUN yum -y install initscripts
WORKDIR /usr
#RUN echo "bind-address=0.0.0.0" >> /etc/my.cnf
RUN /usr/bin/mysql_install_db --datadir="/var/lib/mysql" --user=mysql
RUN /usr/bin/mysqld_safe --datadir="/var/lib/mysql" --socket="/var/lib/mysql/mysql.sock" --user=mysql >/dev/null 2>&1 &
RUN /usr/bin/mysqladmin -u root password SOMEPASSWORD
CMD tail -f /var/log/mariadb/mariadb.log
EXPOSE 3306
有关的:
- 在 Ubuntu 上脚本安装 MySQL
- https://askubuntu.com/questions/79257/how-do-i-install-mysql-without-a-password-prompt
- https://stackoverflow.com/questions/1202347/how-can-i-pass-a-password-from-a-bash-script-to-aptitude-for-installing-mysql
- https://stackoverflow.com/questions/7739645/install-mysql-on-ubuntu-without-password-prompt
答案1
我正在处理类似的问题,在 Docker 容器中设置 mariadb。我发现这寻找运行 mysql_secure_install 的方法。有多种方法可以将输入提供给脚本,或者您可以简单地运行脚本将运行的命令。我选择了后者。
我也遇到了同样的问题,即命令找不到正在运行的 MySQL 实例。问题是构建的每个步骤都在单独的容器中运行,因此您必须为每个命令启动 mysql,或者在一个步骤中运行它们。这是我的 Dockerfile 中的内容:
ARG DATABASE_ROOT_PASS
RUN service mysql start \
&& mysqladmin -u root password "$DATABASE_ROOT_PASS" \
&& mysql -u root -p"$DATABASE_ROOT_PASS" -e "UPDATE mysql.user SET Password=PASSWORD('$DATABASE_ROOT_PASS') WHERE User='root'" \
&& mysql -u root -p"$DATABASE_ROOT_PASS" -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')" \
&& mysql -u root -p"$DATABASE_ROOT_PASS" -e "DELETE FROM mysql.user WHERE User=''" \
&& mysql -u root -p"$DATABASE_ROOT_PASS" -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'" \
&& mysql -u root -p"$DATABASE_ROOT_PASS" -e "FLUSH PRIVILEGES"
然后你可以用
docker build . --build-arg DATABASE_ROOT_PASS='changeme123'
您可以找到 --build-arg 的文档这里。