web-dev-qa-db-fra.com

Comment gérer un nom d'hôte spécifique comme l'option -h dans Dockerfile

J'utilise CentOS 7 comme démon docker hôte et centos: 6 images Docker.

Je souhaite installer un logiciel qui nécessite un nom d’hôte pouvant être résolu en tant qu’adresse non bouclée. Si je lance une image de menu fixe avec l'option -h comme

docker run -i -t -h myhost centos:6 /bin/bash

Ensuite, je peux installer le logiciel car/etc/hosts dans le conteneur est automatiquement configuré comme

[root@myhost /]# cat /etc/hosts
172.17.0.7  myhost
127.0.0.1   localhost    

[root@myhost /]# ping myhost
PING myhost (172.17.0.7) 56(84) bytes of data.
64 bytes from myhost (172.17.0.7): icmp_seq=1 ttl=64 time=0.033 ms

Mais je ne peux pas utiliser la même manière si je crée une image à partir de Dockerfile. J'ai testé la création d'une image en utilisant le fichier Docker suivant

FROM centos:6

ENV HOSTNAME myhost
RUN ping myhost

Dans le processus de construction du menu fixe, le nom d'hôte attribué ne peut pas être résolu en tant qu'adresse IP dynamique comme suit:

$ docker build -t testimage .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM centos:6
 ---> a30bc9f3097e
Step 1 : ENV HOSTNAME myhost
 ---> Using cache
 ---> e73bf592389e
Step 2 : RUN ping myhost
 ---> Running in ca54c8eac073
ping: unknown Host myhost
INFO[0000] The command [/bin/sh -c ping myhost] returned a non-zero code: 2

Comment utiliser un nom d'hôte spécifique résolu en tant qu'adresse IP de conteneur dynamique?

16
dempasong

Ce n'est généralement pas possible dans un fichier Dockerfile. 

En fonction du logiciel, vous pourrez peut-être faire quelque chose. Par exemple, vous pouvez essayer quelque chose comme

RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.Host.name >> /etc/hosts && install-software

En définissant le nom d'hôte dans la même commande RUN que vous installez le logiciel, cela se produira dans la même couche du conteneur. Docker écrasera plus tard le nom d'hôte et vous devrez le redéfinir à nouveau lors de l'exécution, mais votre logiciel pourrait bien fonctionner avec cela.

Si vous devez faire beaucoup de ceci, vous pouvez essayer Packer pour la construction de conteneurs. Il peut construire des conteneurs Docker, mais n'utilise pas plusieurs couches. Cela ralentit la reconstruction, accélère le téléchargement des images construites et facilite l'utilisation de plusieurs opérations sur une image avant de la figer dans un conteneur.

9

Je pense que ce qui suit est préférable car les conteneurs de docker n’ont généralement pas installé «nom d’hôte». Par conséquent, j’utiliserais la commande head:

echo $(head -1 /etc/hosts | cut -f1) $Host_NAME >> /etc/hosts
3
LMR

Si /etc/hosts ne résout pas le problème, je remplace le binaire hostname.

RUN mv /usr/bin/hostname{,.bkp}; \
  echo "echo myhost.local" > /usr/bin/hostname; \
  chmod +x /usr/bin/hostname

...

RUN mv /usr/bin/hostname{.bkp,}
2
Christophe Morio

En ce qui concerne la solution de contournement, vous pouvez utiliser docker-compose pour créer votre conteneur avec une variable hostname, par exemple.

version: '3'
services:
  all:
    image: testimage
    container_name: myname
    hostname: myhost
    build:
      context: .

Puis lancez comme:

docker-compose --build up
0
kenorb