【问题标题】:Start mysql automatically when running a Docker container运行 Docker 容器时自动启动 mysql
【发布时间】:2023-03-30 19:36:01
【问题描述】:

我已经创建了一个 Dockerfile,以便在我的计算机上使用 php7、mysql 和其他一些库建立一个开发环境。

运行容器时 apache 服务会自动启动,但我无法使用 mysql 获得相同的结果。我的 Dockerfile 的最后一句看起来像这样 CMD ["bash", "run.sh"] 然后在 run.sh 我有这个:

#!/bin/bash
set -e

PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php/7.0/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php/7.0/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php/7.0/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php/7.0/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php/7.0/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php/7.0/cli/php.ini

source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

chmod 0755 start.sh
sleep 1
start.sh

/bin/bash

这会调用一个名为 start.sh 的文件,如下所示:

#!/usr/bin/env bash

# Mysql
sed -i -e 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mysql.conf.d/mysqld.cnf
service mysql start

它分为两个文件,因为我测试了所有内容,但无法正常工作。如果我在容器内执行 docker exec 并启动 mysql 一切正常。

知道我做错了什么吗?

【问题讨论】:

  • 我用 ENTRYPOINT 完成了我的 dockerfile,我给出的脚本以 bash 结尾。它对我有用。

标签: mysql docker dockerfile docker-container


【解决方案1】:

您在 run.sh 脚本中相对较早地运行 exec /usr/sbin/apache2 -DFOREGROUNDexec 的问题在于它不会启动 shell 的子进程,而是 用新进程替换 shell。

来自man page

exec [-cl] [-a name] [command [arguments]]

如果指定了命令,它将替换 shell。不会创建新进程。参数成为命令的参数。

这意味着您的 shell 脚本将不会在调用 exec 后继续运行。

我现在可以提出多种使用 Bash 解决此问题的方法,但所有这些方法(在我看来)都很混乱且难以维护。如果你想在一个容器中管理多个进程(比如 Apache 和 MySQL),我强烈建议你看看像 supervisord 这样的进程管理器。有一个 excellent article in the official documentation 甚至使用了与您类似的用例作为示例。

【讨论】:

    【解决方案2】:

    start.sh 没有绝对或相对路径,就像它在你的 PATH 中一样,是吗?

    您可以在 start.sh 的开头添加一些“echo '我实际上被称为'> log.txt”以检查它是否被调用。

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2023-03-09
      • 2019-05-21
      • 2021-12-13
      相关资源
      最近更新 更多