"docker 빌드"중에 Docker 이미지의 / etc / hosts 파일을 업데이트하는 방법


106

/etc/hosts"docker 빌드"중에 파일 을 업데이트하고 싶습니다 .

Dockerfile에 아래 줄을 추가했지만 /etc/hosts파일을 업데이트 하거나 오류가 발생하지 않습니다.

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

업데이트해야합니다 /etc/hosts. 누구든지 이것에 대해 제안 할 수 있습니까?


docker 빌드를 실행하기 위해 boot2docker를 사용하고 있습니까?
VonC

아니요, Linux 버전의 docker 1.8을 사용하고 있습니다.
Prakash

1
이미지를 컨테이너로 실행할 때 / etc / hosts는 변경되지 않습니까? 아니면 Linux 호스트 / etc / hosts를 참조 했습니까?
VonC

4
도커 빌드 이미지가 성공적으로 빌드되었지만 동일한 이미지를 사용하여 컨테이너를 실행하고 / etc / hosts 파일을 확인했을 때 변경 사항이 없었습니다.
Prakash

답변:


141

최신 버전의 docker를 사용하면 docker-compose 및 해당 지시문 으로 수행 할 수 있습니다.extra_hosts

호스트 이름 매핑을 추가합니다. 클라이언트 매개 변수
와 동일한 값을 사용하십시오 (이미 docker 1.8에서 사용 가능해야 함).docker run--add-host

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

간단히 말해 /etc/hosts, 컨테이너를 빌드하는 것이 아니라 실행할 때 컨테이너를 수정 하십시오.


Docker 17.x +를 사용하면 아래docker build --add-host언급 되어 있지만 문제 34078이 답변 에서 언급했듯이 :

--add-host빌드시 기능은 빌드하는 동안 호스트를 오버라이드 (override) 할 수 있도록 설계되어 있지만 이미지에서 해당 구성을 유지하지.

언급 된 솔루션은 위에서 제안한 docker-compose를 참조합니다.

  • 내부 DNS를 실행합니다. 데몬에서 사용할 기본 DNS 서버를 설정할 수 있습니다. 이렇게하면 시작된 모든 컨테이너가 기본적으로 구성된 DNS를 자동으로 사용합니다.
  • docker compose를 사용하고 docker-compose.yml개발자 에게 제공 하십시오.
    docker compose 파일을 사용하면 컨테이너를 시작할 때 사용해야하는 모든 옵션을 지정할 수 있으므로 개발자는 설정해야하는 모든 옵션을 사용하여 컨테이너를 시작하기 위해 Docker를 구성 할 수 있습니다.

2
도커 이미지에서 / etc / hosts를 변경하고 싶습니다.
Prakash

1
@PrakashSingh 동의합니다.하지만 쉽지 않은 것 같습니다.
VonC

1
@PrakashSingh를 통해 머신에서 bash 인스턴스를 연 docket exec -it <container name> /bin/bash다음 선호하는 명령 줄 편집기 (vim, emacs, nano, echo ''. >> />)를 사용하여 / ect / host 아래에서 도커의 컨테이너 호스트를 업데이트 할 수 있습니다.
NateAGeek

@PrakashSingh 예, 우리는 할 수 있습니다 (친숙한 소리 ...). 그러나 컨테이너를 실행하지 않고 이미지를 빌드하여 호스트 항목을 변경하면 Docker에 대한 일종의 해킹처럼 보입니다. Docker 네트워크 설계는 애플리케이션 중심입니다 (docker.com에서 제공). 호스트 항목은 도커 네트워크의 일부이므로 이미지에서 컨테이너를 실행할 때 정의하는 것이 좋습니다. 정말로 일부 호스트 항목을 추가해야하는 경우 매번 이미지를 빌드하여 추가하지 않고 기본 이미지에 한 번 추가합니다. 이것이 가장 좋은 방법입니다.
Light.G

2
도커 빌드 중에 rocker / shiny install.packages 문제를 해결하기 위해 --add-host : cran.rstudio.com : <IPaddress>가 문제를 해결했습니다.
bvanlew

25

이미지 echo에서 RUN컨테이너를 시작할 때 docker 데몬이 파일 (/ etc / hosts) 및 해당 내용 (hosts 항목)을 유지하므로 in step을 사용하여 이미지의 호스트 파일을 수정할 수 없습니다 .

그러나 다음을 사용하여 동일한 결과를 얻을 수 있습니다.

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

여기서 주목해야 할 핵심 exec은 docker 문서에서 제안 하는 명령 사용입니다 . exec 를 사용 하면 컨테이너에 대한 Java 명령이 PID 1이됩니다. Docker 인터럽트는 이에 대해서만 응답합니다.

참조 https://docs.docker.com/engine/reference/builder/#entrypoint를


타이! 이것은 훌륭한 솔루션입니다
xero

1
kubenetes 솔루션을 찾고 있다면 hostAliases를 사용할 수 있습니다. kubernetes.io/docs/concepts/services-networking/… 마치 docker가 extra_hosts를 작성하는 것과 같습니다.
Shubham Singh

보다 정확하게 ENTRYPOINT는 이미지에 대한 지침이 아닙니다. 이 이미지에서 컨테이너를 실행할 때만 진입 점을 표시합니다. 즉, 컨테이너가 실행 된 후에 만 ​​호스트 항목이 존재합니다. 요구 사항이 필수적이라고 생각하지 않습니다. 약간의 오해가있을 것입니다.
Light.G

17

저는 docker가 최근 --add-host에 docker 빌드에 플래그를 추가했다고 생각 합니다.

[편집]이 기능은 17.04.0-ce 에서 업데이트되었습니다.

플래그 docker build와 함께 사용하는 방법에 대한 자세한 내용은 https://docs.docker.com/edge/engine/reference/commandline/build/--add-host 를 방문하십시오.


1
--add-host기능은 CentOS의 Docker 12에서 사용할 수 있습니다.
chutz

1
; "그것은 의도적으로 이미지에 지속하지 않아야 만 빌드하는 동안 사용되는이 플래그와 함께 추가되는 호스트"나는 그것을 강조하고 싶은 github.com/moby/moby/issues/34078
SIDA 우

10

이것이 여전히 Google에서 첫 번째 답변으로 나오기 때문에 가능한 해결책에 기여할 것입니다.

여기서 가져온 명령은 놀랍게도 나를 위해 일했습니다 (Docker 1.13.1, Ubuntu 16.04) :

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

관련이 없지만 여전히 가치가 있습니다. 고마워.
Light.G 2018 년

4

이것이 누구에게나 유용하다면 HOSTALIASESenv 변수가 저에게 효과적 이었습니다.

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

3
docker와 kubernetes를 혼동하지 않습니까? 나는 고정 표시기 문서의 모든 HOSTALIASES 변수 표시되지 않습니다
아드 르메르

4

docker 실행시 다음 명령으로 수행 할 수 있습니다.

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

여기서 나는 example.comlocalhost 127.0.0.1와 그 작업에 매핑 하고 있습니다.


3

AWS Elasticbeanstalk + Docker + Supervisord를 사용하고 있습니다.

빠른 답변

그냥 몇 가지 코드를 추가합니다 Dockerfile.

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

1

완전한 답변

  1. hostsDocker 컨테이너에 추가 할 파일을 준비하십시오 .
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. hosts다음 줄을 추가 하여 파일을 컨테이너에 복사하십시오 .Dockerfile
COPY hosts /etc/hosts_extra
  1. 당신이 사용하는 방법을 알고있는 경우 ENTRYPOINTCMD또는 CRON작업이 다음에 또는 적어도 다음 명령 줄을 통합 실행중인 컨테이너 내에서이를 실행 :
cat /etc/hosts_extra >> etc/hosts;
  1. Dockerfile수정 사항이 손실되므로에 다음을 추가 할 수 없습니다 .
RUN cat /etc/hosts_extra >> etc/hosts;

0

--add-host를 사용할 수 있습니다.docker 실행 중에 옵션을 .

귀하의 경우 사용 : docker run --add-host mynginx : 192.168.33.11 [image_name] : [tag]

그러면 / etc / hosts 가 업데이트됩니다.

다음 명령을 사용하여 확인할 수 있습니다.

  • docker exec -it [container_id] sh

sh가 작동 하지 않으면 bash 또는 / bin / sh 또는 / bin / bash를 시도 할 수 있습니다.

  • cd 등
  • 고양이 호스트

-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"
  • 정보
  • 사용자는 반드시 su

-2

다음은 도커 빌드 대신 도커 실행 중에 파일을 마운트하여 나를 위해 일했습니다.

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

볼륨을 사용하여 파일을 추가하면 복잡성이 추가되고 모든 호스트에 파일이 있어야합니다.
Shubham Singh 19

-11

다음을 사용하여 컨테이너를 실행하는 간단한 답변 :

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

컨테이너가 열리면 :

cd ..

그때

`cd etc`

그리고 당신은 할 수 있습니다

cat hosts

또는:

apt-get update
apt-get vim

또는 원하는 편집기를 열고 vim에서 열면 시작 IP를 0.0.0.0으로 수정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.