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?
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.
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
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,}
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