无法可靠地确定服务器的完全限定域名...如何在Docker中解决它?

时间:2017-09-17 16:51:20

标签: apache docker

我刚刚开始使用Docker而我正在关注基本上显示以下步骤的tutorial

  1. 创建一个这样的Dockerfile:

    From php:7.0-apache copy src/ /var/www/html EXPOSE 80

  2. 从我的dockerfile构建容器:

    $ docker build -t mytest .

  3. 图像" mytest"生成我运行:

    $ docker run -p 80 mytest

  4. 这就是我得到的错误:

    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
    [Sun Sep 17 16:25:12.340564 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations
    [Sun Sep 17 16:25:12.340666 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
    

    所以,我不知道如何解决它。有什么帮助吗?

6 个答案:

答案 0 :(得分:17)

我想提供另一种(可能更多的Docker-ish)解决警告信息的方法。但首先,在盲目设置ServerName之前理解 Apache实际在做什么来弄清域名是有道理的。 http://ratfactor.com/apache-fqdn.html上有一篇很好的文章解释了这个过程。

一旦我们确认getnameinfo是用于查找名称的/etc/nsswitch.conf,并且它使用nsswitch.conf来确定查找的首选位置,我们就可以找出要修改的内容。

如果我们检查容器内的/etc/hosts,我们可以看到它在外部DNS之前在# cat /etc/nsswitch.conf | grep hosts hosts: files dns 文件中查找主机:

/etc/hosts

知道这一点,也许我们可以在Docker运行时影响文件,而不是将其添加到我们的配置文件中?

如果我们看一下Docker运行参考文档,https://docs.docker.com/engine/reference/run/#managing-etchosts上的/etc/hosts文件中有一节。它提到:

  

您的容器将在/ etc / hosts中包含行,这些行定义容器本身的主机名以及localhost和其他一些常见内容。

因此,如果我们只设置容器主机名,它将被添加到--hostname,这将解决Apache警告。幸运的是,使用-h/etc/hosts选项非常容易。如果我们将其设置为完全限定的域名,Docker会将其设置在我们的$ docker run --rm php:7.0-apache AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Sun Sep 17 19:00:32.919074 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations [Sun Sep 17 19:00:32.919122 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' 文件中,Apache会将其提取出来。

很容易尝试这一点。带警告的示例(无主机名):

-h

现在将$ docker run --rm -h myapp.mydomain.com php:7.0-apache [Sun Sep 17 19:01:27.968915 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations [Sun Sep 17 19:01:27.968968 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' 选项设置为完全限定的域名:

git clone URL

希望这有助于回答这个问题并提供有关Apache和完全合格域名的一些知识。

答案 1 :(得分:2)

这不是一个错误,它只是一个警告,您可以放心地忽略它。它的含义是ServerName未设置,因此它将机器IP视为相同。

如果查看/etc/apache2/sites-available中的默认配置,您会发现000-default.confdefault-ssl.conf

root@d591ab6febff:/etc/apache2/sites-available# cat 000-default.conf
<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

ServerName指令在config

中注释
#ServerName www.example.com

因此,如果您担心警告,则应将其更改为您想要的值,如下所示

ServerName www.tarunlalwani.com
ServerAlias tarunlalwani.com

您需要在文件夹中创建配置,然后使用Dockerfile覆盖默认配置中的文件。然后警告就会消失。

答案 2 :(得分:0)

要避免该警告,您可以使用IP设置ServerName。

请参阅此示例:tagplus5/docker-php/7-apache/Dockerfile

    apt-get install -y --no-install-recommends iproute2 apache2 php7.0 libapache2-mod-php7.0 \
        php7.0-mysql php7.0-sqlite php7.0-bcmath php7.0-curl ca-certificates && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* && \
echo "ServerName $(ip route get 8.8.8.8 | awk '{print $NF; exit}')" >> /etc/apache2/apache2.conf && \

(虽然iproute在Mac上的工作方式不同:它取决于您的主机。请参阅iproute2mac issue 8

答案 3 :(得分:0)

问题:
运行 docker 文件时出现以下错误:

<块引用>

AH00558:apache2:无法可靠地确定服务器的完全限定域名,使用 172.17.0.2。全局设置“ServerName”指令以抑制此消息


解决方案:
转到root
转到etc文件
然后转到apache2
然后纳米apache2.conf文件
然后在 # The directory where shm and other runtime files will be stored. 行下方添加一个新行 (Enter) 并写入:

ServerName localhost

保存文件并退出 root 并再次运行 docker run 命令,它会起作用。


同一问题的 Youtube 视频参考链接:Watch

答案 4 :(得分:0)

我用来添加

sed -i -e 's/Listen 80/Listen 80\nServerName localhost/' /etc/apache2/ports.conf

到 Dockerfile 或入口点文件(如果使用)。

答案 5 :(得分:-1)

如果这是您在日志中看到的全部,并且Docker容器立即关闭,则意味着Apache并未真正运行,因此该容器立即退出。

此错误与该问题没有直接关系,但这只是我需要解决的一切,也许其他人也处于类似情况。

以下是保持其运行的修复程序:https://stackoverflow.com/a/46898038/2062726