"Docker build" sırasında Docker görüntüsündeki / etc / hosts dosyası nasıl güncellenir?


107

/etc/hosts"Docker build" sırasında dosyamı güncellemek istiyorum .

Dockerfile'da aşağıdaki satırı ekledim ama ne /etc/hostsdosya güncelleniyor ne de hata veriyor.

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

Güncellemem gerekiyor /etc/hosts. Bu konuda kimse önerebilir mi?


Docker derlemenizi yürütmek için boot2docker kullanıyor musunuz?
VonC

Hayır, docker 1.8'in Linux sürümünü kullanıyorum.
Prakash

1
Ve görüntünüzü bir kap olarak çalıştırdığınızda, / etc / hosts dosyası değişmez mi? Yoksa Linux host / etc / hosts'dan mı bahsediyordunuz?
VonC

4
Docker derleme imajı sırasında başarılı bir şekilde oluşturuldu. Ancak aynı imajı kullanarak bir konteyner çalıştırdığımda ve / etc / hosts dosyasını kontrol ettiğimde, Değişiklikler orada değildi.
Prakash

Yanıtlar:


142

Docker'ın daha yeni bir sürümüyle bu, docker-compose ve extra_hostsyönergesi ile yapılabilir.

Ana bilgisayar adı eşlemeleri ekleyin. İstemci parametresiyle
aynı değerleri kullanın (docker 1.8 için zaten mevcut olmalıdır).docker run--add-host

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

Kısaca: /etc/hostsKonteynırınızı oluştururken değil çalıştırırken değiştirin .


Docker 17.x + ile, aşağıdadocker build --add-host bahsi geçen bir şeyiniz var , ancak 34078. sayı ve bu cevapta yorumlandığı gibi :

--add-hostİnşa sırasında özellik oluşturma sırasında bir dizi geçersiz kılma izin verecek şekilde tasarlanmıştır ancak görüntüdeki bu yapılandırmayı devam etmeyecekleri.

Bahsedilen çözümler, yukarıda önerdiğim docker-compose ile ilgilidir:

  • Dahili bir DNS çalıştırın; arka planda kullanmak üzere varsayılan DNS sunucusunu ayarlayabilirsiniz; bu şekilde başlatılan her kapsayıcı varsayılan olarak yapılandırılmış DNS'yi otomatik olarak kullanır
  • Docker compose kullanın ve docker-compose.ymlgeliştiricilerinize a sağlayın.
    Docker oluşturma dosyası, bir kapsayıcı başlatılırken kullanılması gereken tüm seçenekleri belirlemenize olanak tanır, böylece geliştiriciler, kapsayıcıyı ayarlamaları gereken tüm seçeneklerle başlatmak için yalnızca docker oluşturabilir.

2
docker görüntüsünde / etc / hosts dosyasını değiştirmek istiyorum.
Prakash

1
@PrakashSingh Katılıyorum, ancak bunu yapmak kolay görünmüyor.
VonC

1
@PrakashSingh ile makinede bir bash örneğini açabilir docket exec -it <container name> /bin/bash, ardından tercih ettiğiniz komut satırı düzenleyicisiyle (vim, emacs, nano, echo ''. >> />) yükleme istasyonunun konteyner ana bilgisayarını / ect / host altında güncelleyebilirsiniz.
NateAGeek

@PrakashSingh Evet yapabiliriz (tanıdık geliyor ...). Ancak, bir konteyner çalıştırarak değil, bir imaj oluşturarak ana bilgisayar girişini değiştirdiğimizde, Docker için bir tür hackleme gibi görünüyor. Docker ağ tasarımı uygulama güdümlüdür (docker.com'dan). Ana bilgisayarlar girişi docker ağının bir parçası olduğu için, bunu imajdan bir konteyner çalıştırırken daha iyi tanımlamalıyız. Gerçekten bir ana bilgisayar girişi eklemeniz gerekiyorsa, bunları her seferinde görüntü oluşturarak eklemezsiniz, bunları temel görüntüye bir kez eklersiniz. En iyi uygulama budur.
Light.G

2
Docker build sırasında rocker / shiny install.packages ile ilgili bir sorunu çözmek için --add-host: cran.rstudio.com: <IPaddress> sorunu benim için çözdü.
bvanlew

25

Sen kullanarak görüntüdeki host dosyasını değiştirir edemez echoiçinde RUNResimdeki bir kabı başlattığınızda liman işçisi cin dosyasını koruyacak çünkü adım (/ etc / hosts) ve onun içeriği (ana girişi).

Bununla birlikte, aynı şeyi başarmak için aşağıdakiler kullanılabilir:

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

Burada dikkat edilmesi gereken anahtar exec, docker belgelerinin önerdiği gibi komutun kullanılmasıdır . Exec kullanımı java komutunu konteyner için PID 1 yapacaktır. Docker kesintileri yalnızca buna yanıt verir.

Bkz. Https://docs.docker.com/engine/reference/builder/#entrypoint


ty! bu harika bir çözüm
xero

1
Kubenetes çözümünü arıyorsanız, hostAliases'ı kullanabilirsiniz. kubernetes.io/docs/concepts/services-networking/… docker compose extra_hosts gibi.
Shubham Singh

Daha doğrusu, ENTRYPOINTimaj için bir talimat değildir. Bu görüntüden bir kapsayıcı çalıştırdığımızda yalnızca bir giriş noktasını işaretler, bu da ana bilgisayar girdisinin yalnızca kapsayıcı çalıştıktan sonra var olduğu anlamına gelir. Gereksinimin gerekli olduğunu düşünmüyorum. Bazı yanlış anlaşılmalar olmalı.
Light.G

17

Sanırım docker son zamanlarda --add-hostdocker build için bayrağı ekledi ki bu gerçekten harika.

[Düzenle] Yani bu özellik 17.04.0-ce'de güncellendi

Bayrak docker buildile nasıl kullanılacağı hakkında daha fazla ayrıntı için --add-hostlütfen şu adresi ziyaret edin: https://docs.docker.com/edge/engine/reference/commandline/build/


1
--add-hostÖzelliği CentOS üzerinde Docker 12 mevcuttur.
chutz

1
"Bu bayrakla eklenen ana bilgisayar yalnızca oluşturma sırasında kullanılır; kasıtlı olarak görüntüde kalmamalıdır
Sida Zhou

10

Bu hala Google'da bir ilk cevap olarak geldiğinden, olası çözüme katkıda bulunacağım.

Buradan alınan komut şaşırtıcı bir şekilde benim için çalıştı (Docker 1.13.1, Ubuntu 16.04):

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

Alakalı değil ama yine de değerli. Teşekkürler.
Light.G

4

Bu herhangi biri için yararlıysa, HOSTALIASESenv değişkeni benim için çalıştı:

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

3
Docker'ı kubernetes ile karıştırmıyor musunuz? Docker belgelerinde HOSTALIASES değişkeni görmüyorum
Adrien Lemaire

4

Docker'ı çalıştırırken aşağıdaki komutla yapabilirsiniz

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

Burada example.comlocalhost 127.0.0.1ve onun çalışmasına eşleme yapıyorum .


3

AWS Elasticbeanstalk + Docker + Supervisord kullanıyorum.

Hızlı cevap

Sadece biraz kod ekleyin Dockerfile.

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

1

Tam Cevap

  1. hostsDocker konteynerine eklemek istediğiniz kendi dosyanızı hazırlayın ;
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. Senin KOPYALARSANIZ hostsaşağıdaki satırı ekleyerek kabın içine dosyayıDockerfile
COPY hosts /etc/hosts_extra
  1. Kullanmak biliyorsanız ENTRYPOINTya CMDya CRONiş sonra içine veya en azından aşağıdaki komut satırını dahil çalışan kabın içine bu çalıştırın:
cat /etc/hosts_extra >> etc/hosts;
  1. DockerfileDeğişiklik kaybolacağı için aşağıdakileri ekleyemezsiniz :
RUN cat /etc/hosts_extra >> etc/hosts;

0

Docker çalışması sırasında --add-host seçeneğini kullanabilirsiniz .

Durumunuz için şunu kullanın: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Bu, / etc / hosts dosyanızı güncelleyecektir

aşağıdaki komutları kullanarak kontrol edebilirsiniz:

  • docker exec -it [container_id] sh

eğer sh sizin için çalışmıyor, o zaman deneyebilirsiniz bash veya / bin / sh veya / bin / bash

  • cd vb.
  • kedi konakları

-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"
  • bilgi
  • kullanıcı su olmalı

-2

Aşağıdaki, docker derlemesi yerine docker çalışması sırasında dosyayı bağlayarak benim için çalıştı

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

Birim kullanarak bir dosya eklemek ek karmaşıklık yaratır ve her ana bilgisayarın dosyaya sahip olması gerekir.
Shubham Singh

-11

Aşağıdakileri kullanarak kapsayıcınızı çalıştırmak için hızlı bir cevap:

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

konteyner açıldığında:

cd ..

sonra

`cd etc`

ve sonra yapabilirsin

cat hosts

veya:

apt-get update
apt-get vim

veya istediğiniz herhangi bir düzenleyiciyi vim'de açın, burada başlangıç ​​ipinizi 0.0.0.0'a değiştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.