web-dev-qa-db-fra.com

Impossible de déterminer de manière fiable le nom de domaine complet du serveur ... Comment le résoudre dans Docker?

Je viens juste de commencer dans Docker et je suivais cela tutoriel qui montre fondamentalement ces étapes:

  1. Créez un fichier Docker comme ceci:

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

  2. Construisez le conteneur à partir duquel j'ai mon fichier docker:

    $ docker build -t mytest .

  3. Une fois l'image "mytest" générée, je l'exécute avec:

    $ docker run -p 80 mytest

C'est ce que j'obtiens comme erreur:

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'

Donc, je ne sais pas comment le résoudre. De l'aide?

17
zwitterion

Je voudrais offrir un autre moyen (peut-être plus Docker-ish) de résoudre le message d'avertissement. Mais d’abord, il est logique de comprendre ce que Apache fait pour déterminer le nom de domaine avant de définir aveuglément ServerName. Il existe un bon article sur http://ratfactor.com/Apache-fqdn.html qui explique le processus.

Une fois que nous pouvons confirmer que getnameinfo est ce que Apache utilise pour rechercher le nom et qu'il utilise /etc/nsswitch.conf pour déterminer où aller en premier pour la recherche, nous pouvons déterminer ce qu’il faut modifier.

Si nous vérifions le nsswitch.conf à l'intérieur du conteneur, nous pouvons voir qu'il recherche les hôtes dans le /etc/hosts fichier avant le DNS externe:

# cat /etc/nsswitch.conf | grep hosts
hosts:          files dns

Sachant cela, nous pourrions peut-être influencer le fichier à l'exécution de Docker au lieu de l'ajouter à nos fichiers de configuration.

Si nous examinons la documentation de référence sur l'exécution de Docker, il y a une section sur le /etc/hosts fichier dans https://docs.docker.com/engine/reference/run/#managing-etchosts . Il mentionne:

Votre conteneur contiendra des lignes dans/etc/hosts qui définiront le nom d'hôte du conteneur lui-même, ainsi que localhost et quelques autres éléments courants.

Donc, si nous venons de définir le nom d’hôte du conteneur, il sera ajouté à /etc/hosts qui résoudra l'avertissement Apache. Heureusement, c'est très facile à faire avec le --hostname ou -h option. Si nous définissons ceci sur un nom de domaine complet, Docker le définira dans notre /etc/hosts fichier et Apache le récupérera.

C'est assez facile d'essayer ça. Exemple avec l'avertissement (pas de nom d'hôte):

$ 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'

Maintenant avec le -h option définie sur un nom de domaine complet:

$ 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'

J'espère que cela vous aidera à répondre à la question et à vous renseigner sur Apache et les noms de domaine pleinement qualifiés.

20
Andy Shinn

Ce n'est pas une erreur, c'est juste un avertissement et vous pouvez l'ignorer en toute sécurité. Cela signifie que ServerName n'est pas défini, donc l'adresse IP de la machine sera la même.

Si vous regardez les configurations par défaut présentes à l'intérieur de /etc/Apache2/sites-available, tu trouveras 000-default.conf et default-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>

La directive ServerName est commentée dans la configuration

#ServerName www.example.com

Donc, si vous êtes inquiet à propos de l'avertissement, vous devriez le changer à la valeur que vous voulez, comme ci-dessous.

ServerName www.tarunlalwani.com
ServerAlias tarunlalwani.com

Vous devez créer une configuration dans votre dossier, puis écraser les fichiers de la configuration par défaut à l'aide de Dockerfile. Alors l'avertissement serait parti.

2
Tarun Lalwani

Pour éviter cet avertissement, vous pouvez définir le nom du serveur avec votre adresse IP.

Voir cet exemple: 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 && \

(Bien que iproute puisse fonctionner différemment sur un Mac: cela dépend de votre hôte. Voir problème iproute2mac 8 )

0
VonC