MariaDB 从不在 docker 图像内启动
MariaDB never starts within docker image
我正在使用 ubuntu trusty 和 MariaDB 5.5 创建一个 docker 映像,但是除非我实际连接到 运行 虚拟机,否则我永远无法启动 MariaDB。
Docker 文件:
FROM ubuntu:trusty
# Upgrade packages
RUN apt-get update && apt-get upgrade -y
# So we can add a repo to apt
RUN apt-get install -y software-properties-common
# Add MariaDB repo to aptitude
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
RUN add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu trusty main'
RUN apt-get update
# Install MariaDB
RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password password PASS'
RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password_again password PASS'
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server
# Start MariaDB
RUN service mysql start
# Configure MariaDB User permissions
RUN echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root
我运行创建的命令:
docker build -t ebth-com-trusty --file `pwd`/Dockerfile `pwd` --no-cache
创建命令总是会失败,原因是:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
但是如果我注释掉 CREATE USER 命令,然后连接到 VM,我可以在 运行 手动 service mysql start
.
之后连接到 MariaDB 就好了
就好像 RUN service mysql start
不起作用,我不确定如何进一步调试它。
Dockerfile 中的每个命令都运行在它自己的容器中。
你可以把这个过程想象成这样:
- 使用之前的镜像启动新容器
- 命令执行完毕
- 容器停转
- 该容器的图像被拍摄用于 运行 在
的下一个命令
这意味着命令 RUN service mysql start
将启动一个新容器,启动 MariaDB,然后关闭容器,包括关闭 MariaDB。
改为尝试使用 CMD 和 ENTRYPOINT。您可以将它们视为设置容器启动后执行的默认可执行文件、命令和参数。但是,两者之间的区别有点微妙。查看文档:CMD and ENTRYPOINT
看起来像这样:
# Create default user
RUN service mysql start && \
echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root
# Start MariaDB
ENTRYPOINT ["/bin/bash"]
CMD ["service", "mysql", "start"]
我正在使用 ubuntu trusty 和 MariaDB 5.5 创建一个 docker 映像,但是除非我实际连接到 运行 虚拟机,否则我永远无法启动 MariaDB。
Docker 文件:
FROM ubuntu:trusty
# Upgrade packages
RUN apt-get update && apt-get upgrade -y
# So we can add a repo to apt
RUN apt-get install -y software-properties-common
# Add MariaDB repo to aptitude
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
RUN add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu trusty main'
RUN apt-get update
# Install MariaDB
RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password password PASS'
RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password_again password PASS'
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server
# Start MariaDB
RUN service mysql start
# Configure MariaDB User permissions
RUN echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root
我运行创建的命令:
docker build -t ebth-com-trusty --file `pwd`/Dockerfile `pwd` --no-cache
创建命令总是会失败,原因是:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
但是如果我注释掉 CREATE USER 命令,然后连接到 VM,我可以在 运行 手动 service mysql start
.
就好像 RUN service mysql start
不起作用,我不确定如何进一步调试它。
Dockerfile 中的每个命令都运行在它自己的容器中。
你可以把这个过程想象成这样:
- 使用之前的镜像启动新容器
- 命令执行完毕
- 容器停转
- 该容器的图像被拍摄用于 运行 在 的下一个命令
这意味着命令 RUN service mysql start
将启动一个新容器,启动 MariaDB,然后关闭容器,包括关闭 MariaDB。
改为尝试使用 CMD 和 ENTRYPOINT。您可以将它们视为设置容器启动后执行的默认可执行文件、命令和参数。但是,两者之间的区别有点微妙。查看文档:CMD and ENTRYPOINT
看起来像这样:
# Create default user
RUN service mysql start && \
echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root
# Start MariaDB
ENTRYPOINT ["/bin/bash"]
CMD ["service", "mysql", "start"]