Cách cập nhật tệp / etc / hosts trong hình ảnh Docker trong quá trình “xây dựng docker”


106

Tôi muốn cập nhật /etc/hoststệp của mình trong quá trình "xây dựng docker".

Tôi đã thêm dòng dưới đây trong Dockerfile nhưng nó không cập nhật /etc/hoststệp cũng như không đưa ra bất kỳ lỗi nào.

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

Tôi cần cập nhật /etc/hosts. Bất cứ ai có thể đề nghị về điều này?


Bạn có đang sử dụng boot2docker để thực thi bản dựng docker của mình không?
VonC

Không, tôi đang sử dụng phiên bản Linux của docker 1.8.
Prakash

1
Và khi bạn đang chạy hình ảnh của mình dưới dạng vùng chứa, / etc / hosts của nó không thay đổi? Hay bạn đang giới thiệu máy chủ Linux / etc / hosts của mình?
VonC

4
Trong quá trình xây dựng docker, hình ảnh được tạo thành công. Nhưng khi tôi chạy một vùng chứa sử dụng cùng một hình ảnh và tôi đã kiểm tra tệp / etc / hosts, thì không có các Thay đổi ở đó.
Prakash

Câu trả lời:


141

Với phiên bản mới hơn của docker, điều này có thể được thực hiện với docker-soạn và chỉ thị của nóextra_hosts

Thêm ánh xạ tên máy chủ.
Sử dụng các giá trị giống như tham số docker runmáy khách--add-host (đã có sẵn cho docker 1.8).

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

Tóm lại: sửa đổi /etc/hostsvùng chứa của bạn khi chạy nó, không phải xây dựng nó.


Với Docker 17.x +, bạn có một docker build --add-hostđề cập bên dưới , nhưng, như đã nhận xét trong vấn đề 34078 và trong câu trả lời này :

Các --add-hosttính năng trong xây dựng được thiết kế để cho phép trọng một máy chủ trong xây dựng, nhưng không phải để tồn tại cấu hình mà trong hình ảnh.

Các giải pháp được đề cập tham khảo docker-soạn mà tôi đã đề xuất ở trên:

  • Chạy một DNS nội bộ; bạn có thể đặt máy chủ DNS mặc định để sử dụng trong daemon; theo cách đó, mọi vùng chứa bắt đầu sẽ tự động sử dụng DNS đã định cấu hình theo mặc định
  • Sử dụng docker soạn và cung cấp một docker-compose.ymlcho các nhà phát triển của bạn.
    Tệp soạn docker cho phép bạn chỉ định tất cả các tùy chọn sẽ được sử dụng khi bắt đầu một vùng chứa, vì vậy các nhà phát triển có thể chỉ cần soạn docker để khởi động vùng chứa với tất cả các tùy chọn họ cần thiết lập.

2
tôi muốn thay đổi / etc / hosts trong hình ảnh docker.
Prakash

1
@PrakashSingh Tôi đồng ý, nhưng điều đó dường như không dễ thực hiện.
VonC

1
@PrakashSingh Bạn có thể mở một phiên bản bash trên máy thông qua docket exec -it <container name> /bin/bash, sau đó cập nhật máy chủ chứa của docker dưới / ect / host bằng trình chỉnh sửa dòng lệnh ưa thích của bạn (vim, emacs, nano, echo ''. >> />).
NateAGeek

@PrakashSingh Có, chúng tôi có thể (nghe quen quen ...). Nhưng nó giống như một loại hack cho Docker khi chúng ta thay đổi mục nhập máy chủ bằng cách xây dựng một hình ảnh chứ không phải chạy một vùng chứa. Thiết kế mạng Docker là hướng ứng dụng (từ docker.com). Vì mục nhập máy chủ là một phần của mạng docker, chúng tôi tốt hơn nên xác định nó khi chạy vùng chứa từ hình ảnh. Nếu bạn thực sự cần thêm một số mục nhập máy chủ, bạn không thêm chúng bằng cách xây dựng hình ảnh mỗi lần, bạn thêm chúng vào hình ảnh cơ sở một lần. Đó là cách thực hành tốt nhất.
Light.G

2
Để giải quyết sự cố với rocker / gloss install.packages trong quá trình xây dựng docker --add-host: cran.rstudio.com: <IPaddress> đã giải quyết vấn đề cho tôi.
bvanlew

25

Bạn không thể sửa đổi tệp máy chủ trong hình ảnh bằng cách sử dụng echotrong RUNbước vì daemon docker sẽ duy trì tệp (/ etc / hosts) và nội dung của nó (mục nhập máy chủ) khi bạn khởi động một vùng chứa từ hình ảnh.

Tuy nhiên, có thể sử dụng những điều sau để đạt được điều tương tự:

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

Điều quan trọng cần lưu ý ở đây là việc sử dụng execlệnh như tài liệu docker gợi ý. Sử dụng exec sẽ làm cho lệnh java như PID 1 container. Các ngắt docker sẽ chỉ đáp ứng điều đó.

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


ty! đây là một giải pháp tuyệt vời
Xero

1
Trong trường hợp bạn đang tìm kiếm giải pháp kubenetes, bạn có thể sử dụng hostAliases. kubernetes.io/docs/concept/services-networking/… giống như docker soạn extra_hosts.
Shubham Singh

Chính xác hơn, ENTRYPOINTkhông phải là một chỉ dẫn cho hình ảnh. Nó chỉ đánh dấu một điểm vào khi chúng tôi chạy một vùng chứa từ hình ảnh này, có nghĩa là mục nhập máy chủ chỉ tồn tại sau khi vùng chứa đang chạy. Tôi không nghĩ rằng yêu cầu là cần thiết. Chắc có một số hiểu lầm.
Light.G

17

Tôi nghĩ rằng docker gần đây đã thêm --add-hostcờ vào bản dựng docker, điều này thực sự tuyệt vời.

[Chỉnh sửa] Vì vậy, tính năng này đã được cập nhật vào 17.04.0-ce

Để biết thêm chi tiết về cách sử dụng docker buildvới --add-hostcờ, vui lòng truy cập: https://docs.docker.com/edge/engine/reference/commandline/build/


1
Các --add-hosttính năng có sẵn trên Docker 12 trên CentOS.
chutz

1
Tôi muốn nhấn mạnh rằng "máy chủ được thêm cờ này chỉ được sử dụng trong quá trình xây dựng; máy chủ này không cố ý tồn tại trong hình ảnh" github.com/moby/moby/issues/34078
Sida Zhou

10

Vì đây vẫn là câu trả lời đầu tiên trong Google nên tôi sẽ đóng góp giải pháp khả thi.

Lệnh lấy từ đây đã làm việc đáng ngạc nhiên cho tôi (Docker 1.13.1, Ubuntu 16.04):

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

Không liên quan nhưng vẫn có giá trị. Cám ơn.
Light.G

4

Nếu điều này hữu ích cho bất kỳ ai, thì HOSTALIASESbiến env đã làm việc cho tôi:

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

3
bạn không nhầm giữa docker với kubernetes? Tôi không thấy bất kỳ biến HOSTALIASES trong tài liệu Docker
Adrien Lemaire

4

Bạn có thể thực hiện với lệnh sau tại thời điểm chạy docker

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

Ở đây tôi đang ánh xạ example.comtới localhost 127.0.0.1và nó đang hoạt động.


3

Tôi đang sử dụng AWS Elasticbeanstalk + Docker + Supervisord.

Câu trả lời nhanh

Chỉ cần thêm một số mã vào Dockerfile.

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

1

Hoàn thành câu trả lời

  1. Chuẩn bị hoststệp của riêng bạn mà bạn muốn thêm vào bộ chứa 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. SAO CHÉP hoststệp của bạn vào vùng chứa bằng cách thêm dòng sau vàoDockerfile
COPY hosts /etc/hosts_extra
  1. Nếu bạn biết cách sử dụng ENTRYPOINThoặc CMDhoặc CRONcông việc, hãy kết hợp dòng lệnh sau vào nó hoặc ít nhất là chạy dòng lệnh này bên trong vùng chứa đang chạy:
cat /etc/hosts_extra >> etc/hosts;
  1. Bạn không thể thêm nội dung sau vào Dockerfilevì sửa đổi sẽ bị mất:
RUN cat /etc/hosts_extra >> etc/hosts;

0

Bạn có thể sử dụng tùy chọn --add-host trong khi chạy docker .

Đối với trường hợp của bạn sử dụng: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Thao tác này sẽ cập nhật / etc / hosts của bạn

bạn có thể kiểm tra nó bằng cách sử dụng các lệnh sau:

  • docker executive -it [container_id] sh

nếu sh không phù hợp với bạn, thì bạn có thể thử bash hoặc / bin / sh hoặc / bin / bash

  • cd vv
  • máy chủ mèo

-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"
  • thông tin
  • người dùng phải su

-2

Sau đây đã làm việc cho tôi bằng cách gắn tệp trong quá trình chạy docker thay vì xây dựng docker

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

thêm một tệp bằng cách sử dụng khối lượng tạo ra sự phức tạp bổ sung và mọi máy chủ lưu trữ đều phải có tệp.
Shubham Singh

-11

Chỉ cần một câu trả lời nhanh để chạy vùng chứa của bạn bằng cách sử dụng:

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

khi vùng chứa được mở:

cd ..

sau đó

`cd etc`

và sau đó bạn có thể

cat hosts

hoặc là:

apt-get update
apt-get vim

hoặc bất kỳ trình soạn thảo nào bạn thích và mở nó bằng vim, ở đây bạn có thể sửa đổi ip khởi động của bạn thành 0.0.0.0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.