Como atualizar o arquivo / etc / hosts na imagem do Docker durante o “docker build”


106

Quero atualizar meu /etc/hostsarquivo durante a "compilação do docker".

Eu adicionei a linha abaixo no Dockerfile, mas não está atualizando o /etc/hostsarquivo nem dando nenhum erro.

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

Eu preciso atualizar /etc/hosts. Alguém pode sugerir isso?


Você está usando o boot2docker para executar a compilação do docker?
VonC

Não, estou usando a versão Linux do docker 1.8.
Prakash

1
E quando você está executando sua imagem como um contêiner, seu / etc / hosts não é alterado? Ou você estava se referindo ao seu host / etc / hosts Linux?
VonC

4
Durante a construção do docker, a imagem é construída com sucesso. Mas quando executo um contêiner usando a mesma imagem e verifiquei o arquivo / etc / hosts, as alterações não estavam lá.
Prakash

Respostas:


141

Com uma versão mais recente do docker, isso poderia ser feito com docker-compose e sua extra_hostsdiretiva

Adicione mapeamentos de nome de host.
Use os mesmos valores do parâmetro do docker runcliente--add-host (que já deve estar disponível para docker 1.8).

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

Resumindo: modifique /etc/hostsseu contêiner ao executá-lo, não ao criá-lo.


Com Docker 17.x +, você tem um docker build --add-hostmencionado abaixo , mas, conforme comentado na edição 34078 e nesta resposta :

O --add-hostrecurso durante a construção é projetado para permitir a substituição de um host durante a construção, mas não para persistir essa configuração na imagem.

As soluções mencionadas referem-se ao docker-compose que sugeri acima:

  • Execute um DNS interno; você pode definir o servidor DNS padrão para usar no daemon; dessa forma, cada contêiner iniciado usará automaticamente o DNS configurado por padrão
  • Use docker compose e forneça um docker-compose.ymlpara seus desenvolvedores.
    O arquivo de composição do docker permite que você especifique todas as opções que devem ser usadas ao iniciar um contêiner, de modo que os desenvolvedores podem simplesmente compor o docker para iniciar o contêiner com todas as opções que precisam definir.

2
quero alterar / etc / hosts na imagem do docker.
Prakash

1
@PrakashSingh Eu concordo, mas isso não parece ser fácil de fazer.
VonC

1
@PrakashSingh Você pode abrir uma instância do bash na máquina através do docket exec -it <container name> /bin/bash, então atualizar o host do contêiner do docker em / ect / host com seu editor de linha de comando preferido (vim, emacs, nano, echo ''. >> />).
NateAGeek

@PrakashSingh Sim, podemos (parece familiar ...). Mas parece uma espécie de hack para o Docker quando mudamos a entrada de hosts criando uma imagem, não executando um contêiner. O design da rede Docker é orientado por aplicativo (em docker.com). Como a entrada de hosts faz parte da rede docker, é melhor defini-la ao executar um contêiner a partir de uma imagem. Se você realmente precisa adicionar alguma entrada de hosts, não os adiciona criando uma imagem todas as vezes, mas apenas uma vez na imagem base. Essa é a melhor prática.
Light.G

2
Para resolver um problema com rocker / brilhante install.packages durante o docker build --add-host: cran.rstudio.com: <IPaddress> resolveu o problema para mim.
bvanlew

25

Você não pode modificar o arquivo host na imagem usando echona RUNetapa porque estivador daemon irá manter o arquivo (/ etc / hosts) e seu conteúdo (entrada de hosts) quando você iniciar um recipiente a partir da imagem.

No entanto, o seguinte pode ser usado para obter o mesmo:

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 " ]

A chave a ser observada aqui é o uso do execcomando, conforme sugere a documentação do docker. O uso de exec tornará o comando java como PID 1 para o contêiner. As interrupções do Docker só respondem a isso.

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


ty! esta é uma ótima solução
xero

1
Caso você esteja procurando por uma solução kubenetes, pode usar hostAliases. kubernetes.io/docs/concepts/services-networking/… assim como docker compose extra_hosts.
Shubham Singh

Mais precisamente, ENTRYPOINTnão é uma instrução para imagem. Ele apenas marca um ponto de entrada quando executamos um contêiner a partir desta imagem, o que significa que a entrada de hosts existe apenas depois que o contêiner está em execução. Não acho que o requisito seja essencial. Deve haver algum mal-entendido.
Luz.G

17

Acho que o docker adicionou recentemente a --add-hostbandeira à compilação do docker, o que é realmente ótimo.

[Editar] Portanto, este recurso foi atualizado em 17.04.0-ce

Para obter mais detalhes sobre como usar docker buildo --add-hostsinalizador, visite: https://docs.docker.com/edge/engine/reference/commandline/build/


1
O --add-hostrecurso está disponível no Docker 12 no CentOS.
chutz

1
Quero enfatizar que "o host adicionado com este sinalizador é usado apenas durante a compilação; ele deliberadamente não deve persistir na imagem" github.com/moby/moby/issues/34078
Sida Zhou

10

Uma vez que esta ainda surge como uma primeira resposta no Google, contribuirei com uma possível solução.

O comando obtido a partir daqui funcionou surpreendentemente para mim (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"

Não é relevante, mas ainda é valioso. THX.
Light.G

4

Se isso for útil para qualquer pessoa, a HOSTALIASESvariável env funcionou para mim:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

3
você não está confundindo docker com kubernetes? Não vejo nenhuma variável HOSTALIASES na documentação do docker
Adrien Lemaire

4

Você pode fazer com o seguinte comando no momento de executar o docker

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

Aqui estou mapeando example.compara localhost 127.0.0.1e está funcionando.


3

Estou usando o AWS Elasticbeanstalk + Docker + Supervisord.

Resposta rápida

Basta adicionar algum código Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

1

Resposta Completa

  1. Prepare seu próprio hostsarquivo que deseja adicionar ao contêiner do docker;
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. COPIE seu hostsarquivo para o contêiner, adicionando a seguinte linha noDockerfile
COPY hosts /etc/hosts_extra
  1. Se você souber como usar ENTRYPOINTou CMDou o CRONtrabalho, incorpore a seguinte linha de comando nele ou pelo menos execute-o dentro do contêiner em execução:
cat /etc/hosts_extra >> etc/hosts;
  1. Você não pode adicionar o seguinte no Dockerfileporque a modificação será perdida:
RUN cat /etc/hosts_extra >> etc/hosts;

0

Você pode usar o --add-host opção durante a execução do docker.

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

Isso irá atualizar seu / etc / hosts

você pode verificar usando os seguintes comandos:

  • docker exec -it [container_id] sh

se sh não funcionar para você, você pode tentar bash ou / bin / sh ou / bin / bash

  • cd etc
  • hospedeiros gatos

-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"
  • informação
  • o usuário deve su

-2

Seguir funcionou para mim, montando o arquivo durante a execução do docker em vez da compilação

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

adicionar um arquivo usando o volume cria uma complexidade adicional e todo host precisa ter o arquivo.
Shubham Singh

-11

Apenas uma resposta rápida para executar seu contêiner usando:

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

assim que o contêiner estiver aberto:

cd ..

então

`cd etc`

e então você pode

cat hosts

ou:

apt-get update
apt-get vim

ou qualquer editor de sua preferência e abri-lo no vim, aqui você pode modificar, digamos, seu ip de inicialização para 0.0.0.0

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.