dockerfile引用自建dns服務(wù)方式
一、指定DNS服務(wù)器
1、docker 啟動(dòng)容器dns會(huì)讀取宿主機(jī)的配置
]# cat /etc/resolv.conf # Generated by NetworkManager search test.com nameserver 114.114.114.114 # docker images|grep centos centos 7 eeb6ee3f44bd 2 weeks ago 204MB
基于centos7打了一個(gè)鏡像,dockerfile如下:
FROM centos:7 RUN echo -e "search test.com\nnameserver 8.8.8.8">/etc/resolv.conf && echo "`sed 'p' -n /etc/resolv.conf`" RUN echo "`sed 'p' -n /etc/resolv.conf`" RUN yum install -y wget && yum clean all
2、嘗試使用RUN 直接修改resolv.conf文件失敗
因?yàn)樵谌萜鲉?dòng)時(shí)的操作,會(huì)被docker run指定的參數(shù)覆蓋
這里指定了dns配置,然后再下面打印了一下,效果如下:
# docker build -t test:dns . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos:7 ---> eeb6ee3f44bd Step 2/4 : RUN echo "search test.com\nnameserver 8.8.8.8">/etc/resolv.conf && echo "`sed 'p' -n /etc/resolv.conf`" ---> Running in f3ec71d93b5f search test.com nameserver 8.8.8.8 Removing intermediate container f3ec71d93b5f ---> c2a5a9f9985f Step 3/4 : RUN echo "`sed 'p' -n /etc/resolv.conf`" ---> Running in 08d22ef982d6 # Generated by NetworkManager search test.com nameserver 114.114.114.114 Removing intermediate container 08d22ef982d6 ---> 9c01241bad24 Step 4/4 : RUN yum install -y wget ---> Running in e831037cf89b Loaded plugins: fastestmirror, ovl Determining fastest mirrors * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.bupt.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package wget.x86_64 0:1.14-18.el7_6.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: wget x86_64 1.14-18.el7_6.1 base 547 k Transaction Summary ================================================================================ Install 1 Package Total download size: 547 k Installed size: 2.0 M Downloading packages: warning: /var/cache/yum/x86_64/7/base/packages/wget-1.14-18.el7_6.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Public key for wget-1.14-18.el7_6.1.x86_64.rpm is not installed Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : wget-1.14-18.el7_6.1.x86_64 1/1 install-info: No such file or directory for /usr/share/info/wget.info.gz Verifying : wget-1.14-18.el7_6.1.x86_64 1/1 Installed: wget.x86_64 0:1.14-18.el7_6.1 Complete! Removing intermediate container e831037cf89b ---> 747d8f4768dd Successfully built 747d8f4768dd Successfully tagged test:dns # docker run --rm -it --name testdns test:dns /bin/sh -c "cat /etc/resolv.conf" # Generated by NetworkManager search test.com nameserver 114.114.114.114
從這可以看到,在第二步設(shè)置dns,第三步打印出的結(jié)果還是讀取的宿主機(jī)的配置。
這里分析了一下原因:
- 由于以Dockerfile的形式構(gòu)建鏡像,其中每一個(gè)指令都是一層,它的過(guò)程是基于基礎(chǔ)鏡像運(yùn)行一個(gè)容器,然后按指令執(zhí)行,第一個(gè)指令完畢后,commit為一個(gè)新的鏡像層,docker再運(yùn)行一個(gè)基于新鏡像的容器,執(zhí)行下一步指令,直到結(jié)束。
- 這樣的好處是,假如共有四個(gè)指令,第三個(gè)失敗了,那么可以基于第二個(gè)指令生成的鏡像繼續(xù)操作,不需要再?gòu)念^操作一遍,節(jié)省資源。
那么,由此可見(jiàn),我在第二步設(shè)置完,docker提交一個(gè)鏡像,docker接下來(lái)運(yùn)行這個(gè)鏡像的時(shí)候,會(huì)讀取宿主機(jī)配置,所以我的設(shè)置也就不生效了。使用docker commit構(gòu)建鏡像也是一樣的效果。
如果想讓它生效,需要在啟動(dòng)命令里指定。
3、使用ENTRYPOINT在容器啟動(dòng)時(shí)的操作
而且不會(huì)被docker run指定的參數(shù)覆蓋。
]# cat Dockerfile FROM centos:7 ENTRYPOINT echo -e "search test.com\nnameserver 8.8.8.8">/etc/resolv.conf && echo "`sed 'p' -n /etc/resolv.conf`" && tail -f /dev/null RUN echo "`sed 'p' -n /etc/resolv.conf`" RUN yum install -y wget && yum clean all 使用entrypoint指令,這個(gè)指令的作用是在容器啟動(dòng)時(shí)的操作,而且不會(huì)被docker run指定的參數(shù)覆蓋。(當(dāng)然也可以覆蓋,在啟動(dòng)的時(shí)候docker run --entrypoint= 可以這樣指定臨時(shí)的啟動(dòng)命令來(lái)覆蓋dockerfile里的entrypoint) # docker build -t test:dns . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos:7 ---> eeb6ee3f44bd Step 2/4 : ENTRYPOINT echo -e "search test.com\nnameserver 8.8.8.8">/etc/resolv.conf && echo "`sed 'p' -n /etc/resolv.conf`" && tail -f /dev/null ---> Running in 361ec0e4cf3b Removing intermediate container 361ec0e4cf3b ---> e062358b2b4d Step 3/4 : RUN echo "`sed 'p' -n /etc/resolv.conf`" ---> Running in 1272cc8f69cb # Generated by NetworkManager search test.com nameserver 114.114.114.114 Removing intermediate container 1272cc8f69cb ---> 08b7026e183e Step 4/4 : RUN yum install -y wget ---> Running in 5346d673e0b7 Loaded plugins: fastestmirror, ovl Determining fastest mirrors * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.bfsu.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package wget.x86_64 0:1.14-18.el7_6.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: wget x86_64 1.14-18.el7_6.1 base 547 k Transaction Summary ================================================================================ Install 1 Package Total download size: 547 k Installed size: 2.0 M Downloading packages: warning: /var/cache/yum/x86_64/7/base/packages/wget-1.14-18.el7_6.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Public key for wget-1.14-18.el7_6.1.x86_64.rpm is not installed Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : wget-1.14-18.el7_6.1.x86_64 1/1 install-info: No such file or directory for /usr/share/info/wget.info.gz Verifying : wget-1.14-18.el7_6.1.x86_64 1/1 Installed: wget.x86_64 0:1.14-18.el7_6.1 Complete! Removing intermediate container 5346d673e0b7 ---> e8c04c88aed2 Successfully built e8c04c88aed2 Successfully tagged test:dns # docker run --rm -it --name testdns test:dns /bin/sh -c "cat /etc/resolv.conf" search test.com nameserver 8.8.8.8
可以看到,使用entrypoint之后,這個(gè)指定的配置便生效了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker從C盤(pán)遷移到D盤(pán)的詳細(xì)流程
本文介紹了如何將使用Docker Desktop和WSL2的Windows 10/11系統(tǒng)中的Docker數(shù)據(jù)盤(pán)從C盤(pán)遷移到D盤(pán)的相關(guān)資料,需要的朋友可以參考下2026-04-04
macOS上用Docker?Desktop快速部署n8n的完整流程
n8n是一個(gè)源代碼開(kāi)放的低代碼工作流自動(dòng)化平臺(tái),它將人工智能功能與業(yè)務(wù)流程自動(dòng)化相結(jié)合,這篇文章主要介紹了macOS上用Docker?Desktop快速部署n8n的完整流程,需要的朋友可以參考下2025-12-12
Docker安裝部署rocketmq-console工具教程
這篇文章主要介紹了Docker安裝部署rocketmq-console工具教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
MinIO在 Docker中修改登錄賬號(hào)和密碼的步驟
本文介紹了如何在Docker容器中運(yùn)行的MinIO修改登錄賬號(hào)和密碼,包括備份數(shù)據(jù)、停止容器、刪除舊容器、啟動(dòng)新容器并設(shè)置新的賬號(hào)和密碼以及驗(yàn)證修改結(jié)果的步驟,感興趣的朋友一起2025-03-03
IntelliJ IDEA(2018版)安裝docker插件的詳細(xì)過(guò)程
這篇文章主要介紹了IntelliJ IDEA安裝docker插件的詳細(xì)過(guò)程,開(kāi)發(fā)工具使用的是IDEA2018.16版,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Dockerfile的使用及docker部署java項(xiàng)目實(shí)踐
Docker通過(guò)Dockerfile構(gòu)建自定義鏡像,簡(jiǎn)化部署流程,主要指令包括FROM、RUN、CMD、ENTRYPOINT、ENV、ADD、COPY、VOLUME、WORKDIR和USER,構(gòu)建Java環(huán)境需準(zhǔn)備目錄、Dockerfile、JDK和jar文件,執(zhí)行構(gòu)建命令并驗(yàn)證部署2026-03-03
使用Dockerfile實(shí)現(xiàn)數(shù)據(jù)卷的掛載問(wèn)題(推薦)
Dockerfile就是一個(gè)可以用來(lái)構(gòu)建鏡像的文件,可以理解為一個(gè)腳本文件,可以通過(guò)這個(gè)腳本文件自定義生成一個(gè)我們想要的鏡像,鏡像都是一層一層的,里面的每一條命令就是一層,本文給大家介紹使用Dockerfile實(shí)現(xiàn)數(shù)據(jù)卷的掛載,感興趣的朋友一起看看吧2022-03-03
docker安裝redis掛載容器卷同時(shí)開(kāi)啟持久化
本文主要介紹了docker安裝redis掛載容器卷同時(shí)開(kāi)啟持久化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

