Cómo actualizar el archivo / etc / hosts en la imagen de Docker durante la "compilación de docker"

106

Quiero actualizar mi /etc/hostsarchivo durante la "compilación de Docker".

Agregué la siguiente línea en Dockerfile pero no actualiza el /etc/hostsarchivo ni da ningún error.

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

Necesito actualizar /etc/hosts. ¿Alguien puede sugerir sobre esto?

Prakash
fuente
¿Está utilizando boot2docker para ejecutar su compilación de Docker?
VonC
No, estoy usando la versión de Linux de Docker 1.8.
Prakash
1
¿Y cuando ejecuta su imagen como un contenedor, su / etc / hosts no cambia? ¿O se refería a su host Linux / etc / hosts?
VonC
4
Durante la construcción de la ventana acoplable, la imagen se construyó correctamente. Pero cuando ejecuto un contenedor con la misma imagen y verifiqué el archivo / etc / hosts, los cambios no estaban allí.
Prakash

Respuestas:

141

Con una versión más reciente de docker, esto podría hacerse con docker-compose y su extra_hostsdirectiva

Agregue asignaciones de nombres de host.
Utilice los mismos valores que el parámetro del docker runcliente--add-host (que ya debería estar disponible para Docker 1.8).

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

En resumen: modifica /etc/hoststu contenedor al ejecutarlo, no al construirlo.


Con Docker 17.x +, se docker build --add-hostmenciona a continuación , pero, como se comentó en el número 34078 y en esta respuesta :

La --add-hostfunción durante la compilación está diseñada para permitir anular un host durante la compilación, pero no para conservar esa configuración en la imagen.

Las soluciones mencionadas se refieren al docker-compose que sugería anteriormente:

  • Ejecute un DNS interno; puede configurar el servidor DNS predeterminado para usar en el demonio; de esa manera, cada contenedor iniciado usará automáticamente el DNS configurado por defecto
  • Use docker compose y proporcione un docker-compose.ymla sus desarrolladores.
    El archivo de composición de la ventana acoplable le permite especificar todas las opciones que se deben usar al iniciar un contenedor, por lo que los desarrolladores pueden simplemente componer la ventana acoplable para iniciar el contenedor con todas las opciones que necesitan configurar.
VonC
fuente
2
quiero cambiar / etc / hosts en la imagen de la ventana acoplable.
Prakash
1
@PrakashSingh Estoy de acuerdo, pero eso no parece fácil de hacer.
VonC
1
@PrakashSingh Puede abrir una instancia de bash en la máquina a través de docket exec -it <container name> /bin/bash, luego actualizar el host contenedor de la ventana acoplable en / ect / host con su editor de línea de comando preferido (vim, emacs, nano, echo ''. >> />).
NateAGeek
@PrakashSingh Sí, podemos (suena familiar ...). Pero parece una especie de truco para Docker cuando cambiamos la entrada de hosts al crear una imagen, no ejecutar un contenedor. El diseño de la red Docker se basa en aplicaciones (de docker.com). Dado que la entrada de hosts es parte de la red de Docker, es mejor definirla al ejecutar un contenedor desde una imagen. Si realmente necesita agregar alguna entrada de hosts, no los agrega construyendo la imagen cada vez, los agrega a la imagen base una vez. Esa es la mejor práctica.
Light.G
2
Para resolver un problema con rocker / shiny install.packages durante la compilación de docker --add-host: cran.rstudio.com: <IPaddress> resolvió el problema por mí.
bvanlew
25

No se puede modificar el archivo host de la imagen utilizando echoen el RUNpaso porque el demonio ventana acoplable mantendrá el archivo (/ etc / hosts) y su contenido (entrada hosts) cuando se inicia un contenedor de la imagen.

Sin embargo, se puede utilizar lo siguiente para lograr lo mismo:

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec java -jar ./botblocker.jar " ]

La clave a tener en cuenta aquí es el uso del execcomando como sugiere la documentación de la ventana acoplable. El uso de exec hará que el comando java sea PID 1 para el contenedor. Las interrupciones de Docker solo responderán a eso.

Ver https://docs.docker.com/engine/reference/builder/#entrypoint

Shubham Singh
fuente
ty! esta es una gran solución
xero
1
En caso de que esté buscando una solución de kubenetes, puede utilizar hostAliases. kubernetes.io/docs/concepts/services-networking/… al igual que Docker compone extra_hosts.
Shubham Singh
Más precisamente, ENTRYPOINTno es una instrucción para la imagen. Solo marca un punto de entrada cuando ejecutamos un contenedor desde esta imagen, lo que significa que la entrada de hosts existe solo después de que se ejecuta el contenedor. No creo que el requisito sea imprescindible. Debe haber algún malentendido.
Light.G
17

Creo que Docker agregó recientemente la --add-hostbandera a la compilación de Docker, lo cual es realmente genial.

[Editar] Así que esta función se actualizó el 17.04.0-ce

Para obtener más detalles sobre cómo utilizar docker buildla --add-hostbandera, visite: https://docs.docker.com/edge/engine/reference/commandline/build/

Bill Cheng
fuente
1
La --add-hostfunción está disponible en Docker 12 en CentOS.
chutz
1
Quiero enfatizar que "el host que se agrega con esta bandera solo se usa durante la compilación; deliberadamente no debe persistir en la imagen" github.com/moby/moby/issues/34078
Sida Zhou
10

Dado que esto todavía aparece como una primera respuesta en Google, contribuiré con una posible solución.

El comando tomado de aquí funcionó sorprendentemente para mí (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Remy
fuente
No es relevante pero sigue siendo valioso. Gracias.
Light.G
4

Si esto es útil para alguien, la HOSTALIASESvariable env funcionó para mí:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
usuario10805445
fuente
3
¿no estás confundiendo docker con kubernetes? No veo ninguna variable HOSTALIASES en la documentación de la ventana acoplable
Adrien Lemaire
4

Puedes hacerlo con el siguiente comando a la hora de ejecutar docker

docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>

Aquí estoy mapeando example.coma localhost 127.0.0.1y su funcionamiento.

Asad Shakeel
fuente
3

Estoy usando AWS Elasticbeanstalk + Docker + Supervisord.

Respuesta rápida

Solo agregue un poco de código Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;
Jay Lim
fuente
1

Respuesta completa

  1. Prepare su propio hostsarchivo que desea agregar al contenedor de la ventana acoplable;
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. COPIAR su hostsarchivo en el contenedor agregando la siguiente línea en elDockerfile
COPY hosts /etc/hosts_extra
  1. Si sabe cómo usar ENTRYPOINTo CMDo CRONjob, incorpore la siguiente línea de comando o al menos ejecútelo dentro del contenedor en ejecución:
cat /etc/hosts_extra >> etc/hosts;
  1. No puede agregar lo siguiente en el Dockerfileporque la modificación se perderá:
RUN cat /etc/hosts_extra >> etc/hosts;
Jansen Simanullang
fuente
0

Puede usar la opción --add-host durante la ejecución de la ventana acoplable.

Para su caso, use: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Esto actualizará su / etc / hosts

puede verificarlo usando los siguientes comandos:

  • docker exec -it [container_id] sh

si sh no funciona para usted, puede probar bash o / bin / sh o / bin / bash

  • cd, etc.
  • anfitriones de gatos
Karan Raj
fuente
-1
Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM" 
CMD ["bash","change_hosts.sh"]`

#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • info
  • el usuario debe su
Apellido
fuente
-2

Lo siguiente funcionó para mí al montar el archivo durante la ejecución de la ventana acoplable en lugar de la compilación de la ventana acoplable

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

fuente
agregar un archivo usando el volumen crea una complejidad adicional y cada host debe tener el archivo.
Shubham Singh
-11

Solo una respuesta rápida para ejecutar su contenedor usando:

docker exec -it <container name> /bin/bash

una vez que el contenedor está abierto:

cd ..

luego

`cd etc`

y luego puedes

cat hosts

o:

apt-get update
apt-get vim

o cualquier editor que te guste y ábrelo en vim, aquí puedes modificar, digamos, tu ip de inicio a 0.0.0.0

Esk Aie
fuente