Cara memperbarui / etc / hosts file di image Docker selama "docker build"

106

Saya ingin memperbarui /etc/hostsfile saya selama "pembuatan buruh pelabuhan".

Saya menambahkan baris di bawah ini di Dockerfile tetapi tidak memperbarui /etc/hosts file atau memberikan kesalahan apa pun.

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

Saya perlu memperbarui /etc/hosts . Adakah yang bisa menyarankan ini?

Prakash
sumber
Apakah Anda menggunakan boot2docker untuk menjalankan build buruh pelabuhan Anda?
VonC
Tidak, saya menggunakan versi Linux dari docker 1.8.
Prakash
1
Dan saat Anda menjalankan gambar Anda sebagai container, / etc / hosts tidak berubah? Atau apakah Anda merujuk host Linux / etc / hosts?
VonC
4
Selama gambar build buruh pelabuhan berhasil dibangun. Tetapi ketika saya menjalankan kontainer menggunakan gambar yang sama dan saya memeriksa file / etc / hosts, Perubahan tidak ada.
Prakash

Jawaban:

141

Dengan versi buruh pelabuhan yang lebih baru, ini bisa dilakukan dengan buruh pelabuhan dan extra_hostsarahannya

Tambahkan pemetaan nama host.
Gunakan nilai yang sama dengan parameter docker runklien--add-host (yang seharusnya sudah tersedia untuk buruh pelabuhan 1.8).

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

Singkatnya: modifikasi /etc/hostspenampung Anda saat menjalankannya, bukan membuatnya.


Dengan Docker 17.x +, Anda memiliki yang docker build --add-hostdisebutkan di bawah ini , tetapi, seperti yang dikomentari dalam masalah 34078 dan dalam jawaban ini :

The --add-hostFitur selama membangun dirancang untuk memungkinkan override host selama membangun, tetapi tidak bertahan konfigurasi yang di gambar.

Solusi yang disebutkan merujuk pada docker-compose yang saya sarankan di atas:

  • Jalankan DNS internal; Anda dapat mengatur server DNS default untuk digunakan dalam daemon; dengan cara itu setiap penampung yang dimulai akan secara otomatis menggunakan DNS yang dikonfigurasi secara default
  • Gunakan docker compose dan berikan docker-compose.ymlkepada developer Anda.
    File pembuatan buruh pelabuhan memungkinkan Anda untuk menentukan semua opsi yang harus digunakan saat memulai sebuah penampung, sehingga pengembang bisa saja membuat pembuat galangan untuk memulai penampung dengan semua opsi yang perlu mereka atur.
VonC
sumber
2
saya ingin mengubah / etc / hosts pada image buruh pelabuhan.
Prakash
1
@PrakashSingh Saya setuju, tetapi itu tampaknya tidak mudah dilakukan.
VonC
1
@PrakashSingh Anda dapat membuka instance bash di mesin melalui docket exec -it <container name> /bin/bash, lalu memperbarui host container buruh pelabuhan di bawah / ect / host dengan editor baris perintah pilihan Anda (vim, emacs, nano, echo ''. >> />).
NateAGeek
@PrakashSingh Ya kami bisa (terdengar familiar ...). Tapi itu hanya terlihat seperti hack untuk Docker ketika kita mengubah entri host dengan membuat image, bukan menjalankan container. Desain jaringan Docker digerakkan oleh aplikasi (dari docker.com). Karena entri host adalah bagian dari jaringan buruh pelabuhan, sebaiknya kita mendefinisikannya saat menjalankan wadah dari gambar. Jika Anda benar-benar perlu menambahkan beberapa entri host, Anda tidak menambahkannya dengan membuat gambar setiap saat, Anda menambahkannya ke gambar dasar sekali. Itu adalah praktik terbaik.
Light.G
2
Untuk mengatasi masalah dengan install.packages rocker / shiny selama docker build --add-host: cran.rstudio.com: <IPaddress> memecahkan masalah untuk saya.
bvanlew
25

Anda tidak dapat memodifikasi file host pada gambar menggunakan echodi RUNlangkah karena daemon docker akan memelihara file (/ etc / hosts) dan isinya (entri host) saat Anda memulai container dari image.

Namun, berikut ini dapat digunakan untuk mencapai hal yang sama:

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

Kunci untuk diperhatikan di sini adalah penggunaan execperintah seperti yang disarankan oleh dokumentasi buruh pelabuhan. Penggunaan exec akan menjadikan perintah java sebagai PID 1 untuk container. Interupsi Docker hanya akan menanggapi itu.

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

Shubham Singh
sumber
ty! ini adalah solusi yang bagus
xero
1
Jika Anda mencari solusi kubenetes, Anda dapat menggunakan hostAliases. kubernetes.io/docs/concepts/services-networking/… seperti buruh pelabuhan yang membuat extra_hosts.
Shubham Singh
Lebih tepatnya, ENTRYPOINTbukanlah instruksi untuk gambar. Ini hanya menandai titik masuk ketika kita menjalankan wadah dari gambar ini, yang berarti entri host hanya ada setelah wadah berjalan. Saya tidak berpikir persyaratan itu penting. Pasti ada kesalahpahaman.
Light.G
17

Saya pikir buruh pelabuhan baru-baru ini menambahkan file --add-host bendera ke pembuat buruh pelabuhan yang sangat bagus.

[Sunting] Jadi fitur ini telah diperbarui pada 17.04.0-ce

Untuk detail lebih lanjut tentang cara menggunakan docker builddengan --add-hostbendera, silakan kunjungi: https://docs.docker.com/edge/engine/reference/commandline/build/

Bill Cheng
sumber
1
The --add-hostfitur tersedia di Docker 12 pada CentOS.
chutz
1
Saya ingin menekankan bahwa "host yang ditambahkan dengan bendera ini hanya digunakan selama pembuatan; ini dengan sengaja tidak boleh bertahan dalam gambar" github.com/moby/moby/issues/34078
Sida Zhou
10

Karena ini masih muncul sebagai jawaban pertama di Google, saya akan memberikan solusi yang mungkin.

Perintah diambil dari sini ternyata berfungsi untuk saya (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Remy
sumber
Tidak relevan tapi tetap berharga. Terima kasih.
Light.G
4

Jika ini berguna untuk siapa saja, HOSTALIASESvariabel env berfungsi untuk saya:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
pengguna10805445
sumber
3
bukankah kamu membingungkan buruh pelabuhan dengan kubernetes? Saya tidak melihat variabel HOSTALIASES dalam dokumentasi buruh pelabuhan
Adrien Lemaire
4

Anda dapat melakukannya dengan perintah berikut pada saat menjalankan buruh pelabuhan

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

Di sini saya memetakan example.comke localhost 127.0.0.1dan cara kerjanya.

Asad Shakeel
sumber
3

Saya menggunakan AWS Elasticbeanstalk + Docker + Supervisord.

Jawaban cepat

Cukup tambahkan beberapa kode Dockerfile.

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

Jawaban Lengkap

  1. Siapkan hostsfile Anda sendiri yang ingin Anda tambahkan ke kontainer buruh pelabuhan;
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. SALIN hosts file ke dalam wadah dengan menambahkan baris berikut diDockerfile
COPY hosts /etc/hosts_extra
  1. Jika Anda tahu cara menggunakan ENTRYPOINTatauCMD atau CRONtugas, gabungkan baris perintah berikut ke dalamnya atau setidaknya jalankan ini di dalam penampung yang sedang berjalan:
cat /etc/hosts_extra >> etc/hosts;
  1. Anda tidak dapat menambahkan yang berikut ini Dockerfilekarena modifikasi akan hilang:
RUN cat /etc/hosts_extra >> etc/hosts;
Jansen Simanullang
sumber
0

Anda dapat menggunakan --add-host selama menjalankan buruh pelabuhan.

Untuk kasus Anda, gunakan: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Ini akan memperbarui / etc / hosts Anda

Anda dapat memeriksanya dengan menggunakan perintah berikut:

  • buruh pelabuhan exec -it [container_id] sh

jika sh tidak bekerja untuk Anda, maka Anda dapat mencoba bash atau / bin / sh atau / bin / bash

  • cd dll
  • tuan rumah kucing
Karan Raj
sumber
-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
  • pengguna harus su
Nama Belakang
sumber
-2

Mengikuti bekerja untuk saya dengan memasang file selama menjalankan buruh pelabuhan alih-alih membangun buruh pelabuhan

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

sumber
menambahkan file menggunakan volume menciptakan kerumitan tambahan dan setiap host harus memiliki file tersebut.
Shubham Singh
-11

Hanya jawaban cepat untuk menjalankan container Anda menggunakan:

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

setelah wadah terbuka:

cd ..

kemudian

`cd etc`

dan kemudian Anda bisa

cat hosts

atau:

apt-get update
apt-get vim

atau editor apa pun yang Anda suka dan buka di vim, di sini Anda dapat memodifikasi, katakanlah ip startup Anda ke 0.0.0.0

Esk Aie
sumber