it-swarm.com.de

Wie wird mit einem bestimmten Hostnamen wie der Option -h in Dockerfile gearbeitet?

Ich verwende CentOS 7 als Docker-Daemon-Host und Centos: 6-Docker-Images.

Ich möchte einige Software installieren, die einen auflösbaren Hostnamen als Nicht-Loopback-Adresse erfordert. Wenn ich ein Docker-Image mit der Option -h ausführen möchte

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

Dann kann ich die Software installieren, da/etc/hosts im Container automatisch konfiguriert wird

[[email protected] /]# cat /etc/hosts
172.17.0.7  myhost
127.0.0.1   localhost    

[[email protected] /]# 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

Ich kann jedoch nicht dieselbe Methode verwenden, wenn ich ein Bild aus Dockerfile erstelle. Ich habe das Erstellen eines Images mithilfe der folgenden Docker-Datei getestet

FROM centos:6

ENV HOSTNAME myhost
RUN ping myhost

Im Docker-Build-Prozess kann der zugewiesene Hostname nicht wie folgt als dynamische IP-Adresse aufgelöst werden:

$ 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

Wie kann ich einen bestimmten Hostnamen verwenden, der als dynamische Container-IP-Adresse aufgelöst wird?

16
dempasong

Dies ist in einer Docker-Datei normalerweise nicht möglich. 

Abhängig von der Software können Sie möglicherweise eine Art Problemumgehung durchführen. Zum Beispiel könnte man so etwas versuchen

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

Wenn Sie den Hostnamen innerhalb des gleichen RUN-Befehls festlegen, in dem Sie die Software installieren, geschieht dies in derselben Ebene des Containers. Docker überschreibt später den Hostnamen, und Sie müssen ihn bei der Ausführung neu einstellen, aber Ihre Software ist möglicherweise in Ordnung.

Wenn Sie viel tun müssen, versuchen Sie Packer , um Container zu erstellen. Es kann Docker-Container erstellen, verwendet jedoch nicht mehrere Ebenen. Dadurch wird der Wiederaufbau langsamer, die erstellten Bilder werden schneller heruntergeladen, und es ist bequemer, mehrere Vorgänge an einem Bild auszuführen, bevor es in einen Container eingefroren wird.

9

Ich denke, das Folgende ist besser, da Docker-Container normalerweise keinen 'Hostnamen' installiert haben. Daher würde ich den Befehl head verwenden:

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

Wenn /etc/hosts nicht hilft, ersetze ich die hostname-Binärdatei.

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

Als Problemumgehung können Sie docker-compose verwenden, um Ihren Container mit einer bestimmten hostname zu erstellen, z.

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

Dann laufen Sie als:

docker-compose --build up
0
kenorb