【发布时间】:2021-01-17 05:53:38
【问题描述】:
我创建了一个 docker 镜像,但我无法自动启动甚至启动 mysql。
问题是在entrypoint.sh 中回显"$@",我希望运行mysqld_safe,但它没有。如果将行 echo "$@" 更改为 mysqld_safe --user=mysql 它将成功启动。我不知道以mysql_safe --user=mysql 自动运行的正确形式是什么。在 dockerfile CMD[] 中应该写什么才能正确运行 entrypoint.sh。
接下来是我的代码:
-----------
Dockerfile:
-----------
## OS part
## -------
FROM debian:buster-slim
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
#RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr
# Add packages for testing
RUN apt-get install iproute2 iputils-ping net-tools vim traceroute less -y
## MYSQL part
##-----------
ENV PATH /usr/local/mysql/bin:$PATH
#ENV MYSQLDATA /usr/local/mysql/data
VOLUME /usr/local/mysql/
ADD mysql-standard-4.0.27-pc-linux-gnu-i686 /usr/local/mysql
ADD my.cnf /etc/
#RUN chown -R mysql /usr/local/mysql/ && chgrp -R mysql /usr/local/mysql/
COPY entrypoint.sh /usr/local/bin/
#RUN chmod +x /entrypoint.sh
EXPOSE 3306
ENTRYPOINT ["entrypoint.sh"]
CMD ["mysqld_safe"]
---------------
Entrypoint.sh:
---------------
#!/bin/bash
set -e
# global variable
setup_env() {
MYSQLDATA="/usr/local/mysql/data"
MYSQLBASE="/usr/local/mysql"
MYSQL_ROOT_PASSWORD="password"
}
# init database
init__database_dir() {
echo "Change rights ..."
ls -la "$MYSQLDATA"
chown -R mysql "$MYSQLDATA"
chgrp -R mysql "$MYSQLDATA"
echo "Initializing database..."
cd $MYSQLBASE
scripts/mysql_install_db --user=mysql
}
temp_server_start() {
mysqld_safe --user=mysql &
}
temp_server_stop() {
mysqladmin shutdown -uroot
sleep 30
}
setup_db() {
sleep 20
echo "start password setting"
mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION"
echo "password ready"
}
# start mysql if it is exist.
main() {
setup_env
if [ -z "$(ls -A "$MYSQLDATA/mysql/")" ]; then
init__database_dir
temp_server_start
setup_db
temp_server_stop
fi
echo "start mysqld_safe"
echo "$@"
}
main
【问题讨论】:
-
我的意思是 exec "$@" 尽管有回声
-
为什么不直接运行 Docker Hub
mysql镜像? -
在我的公司单独运行 17 个 mysql 4,这些 mysql 服务器是一个更大的集成系统的一部分。这些 mysql 服务器在旧的 xen 虚拟主机上单独运行。我打算将它们移动到 docker 主机中,因此我设法减少了单独运行的 xen 主机,并且可以在受支持的主机上运行这些 mysql。