亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Dockerfile建立一個(gè)自定義的鏡像執(zhí)行自定義進(jìn)程詳細(xì)過(guò)程

 更新時(shí)間:2022年12月12日 08:33:40   作者:良知猶存  
這篇文章主要介紹了Dockerfile建立一個(gè)自定義的鏡像執(zhí)行自定義進(jìn)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

docker對(duì)我來(lái)說(shuō)是一個(gè)很方便的工具,,上一篇文章也寫了docker基本的一些使用,這篇文章重點(diǎn)描述一下Dockerfile的使用,從零建立一個(gè)自己定制化的鏡像,并可以執(zhí)行我們需要的任務(wù)。

命令列表

FROM 指定基礎(chǔ)鏡像:所謂定制鏡像,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制。就像我們之前運(yùn)行了一個(gè) nginx 鏡像的容器,再進(jìn)行修改一樣,基礎(chǔ)鏡像是必須指定的。而 FROM 就是指定 基礎(chǔ)鏡像,因此一個(gè) Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令

RUN 執(zhí)行命令:RUN 指令是用來(lái)執(zhí)行命令行命令的。其格式有兩種:

  • shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN 指令就是這種格式
  • exec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],這更像是函數(shù)調(diào)用中的格式。

COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置

ADD 指令和 COPY 的格式和性質(zhì)基本一致。但是在 COPY 基礎(chǔ)上增加了一些功能。因此在 COPY 和 ADD 指令中選擇的時(shí)候,可以遵循這樣的原則,所有的文件復(fù)制均使用 COPY 指令,僅在需要自動(dòng)解壓縮的場(chǎng)合使用 ADD。

CMD 指令的格式和 RUN 相似,也是兩種格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]

參數(shù)列表格式:CMD ["參數(shù)1", "參數(shù)2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的參數(shù)。Docker 不是虛擬機(jī),容器就是進(jìn)程。既然是進(jìn)程,那么在啟動(dòng)容器的時(shí)候,需要指定所運(yùn)行的程序及參數(shù)。CMD 指令就是用于指定默認(rèn)的容器主進(jìn)程的啟動(dòng)命令的。

ENTRYPOINT 的格式和 RUN 指令格式一樣,分為 exec 格式和 shell 格式。

LABEL:你可以給鏡像添加標(biāo)簽來(lái)幫助組織鏡像、記錄許可信息、輔助自動(dòng)化構(gòu)建等。每個(gè)標(biāo)簽一行,由 LABEL 開頭加上一個(gè)或多個(gè)標(biāo)簽對(duì)。下面的示例展示了各種不同的可能格式。# 開頭的行是注釋內(nèi)容。

EXPOSE:EXPOSE 指令用于指定容器將要監(jiān)聽的端口。因此,你應(yīng)該為你的應(yīng)用程序使用常見的端口。例如,提供 Apache web 服務(wù)的鏡像應(yīng)該使用 EXPOSE 80,而提供 MongoDB 服務(wù)的鏡像使用 EXPOSE 27017。 對(duì)于外部訪問(wèn),用戶可以在執(zhí)行 docker run 時(shí)使用一個(gè)標(biāo)志來(lái)指示如何將指定的端口映射到所選擇的端口。

ENV:為了方便新程序運(yùn)行,你可以使用 ENV 來(lái)為容器中安裝的程序更新 PATH 環(huán)境變量。例如使用 ENV PATH /usr/local/nginx/bin:$PATH 來(lái)確保 CMD ["nginx"] 能正確運(yùn)行。 ENV 指令也可用于為你想要容器化的服務(wù)提供必要的環(huán)境變量,比如 Postgres 需要的 PGDATA。 最后,ENV 也能用于設(shè)置常見的版本號(hào),比如下面的示例:

VOLUME:VOLUME 指令用于暴露任何數(shù)據(jù)庫(kù)存儲(chǔ)文件,配置文件,或容器創(chuàng)建的文件和目錄。強(qiáng)烈建議使用 VOLUME 來(lái)管理鏡像中的可變部分和用戶可以改變的部分。

USER:如果某個(gè)服務(wù)不需要特權(quán)執(zhí)行,建議使用 USER 指令切換到非 root 用戶。先在 Dockerfile 中使用類似 RUN groupadd -r postgres && useradd -r -g postgres postgres 的指令創(chuàng)建用戶和用戶組。

WORKDIR:為了清晰性和可靠性,你應(yīng)該總是在 WORKDIR 中使用絕對(duì)路徑。另外,你應(yīng)該使用 WORKDIR 來(lái)替代類似于 RUN cd ... && do-something 的指令,后者難以閱讀、排錯(cuò)和維護(hù)。

https://yeasy.gitbook.io/docker_practice/appendix/best_practices

命令驗(yàn)證執(zhí)行

從docker build 開發(fā)

先做個(gè)簡(jiǎn)單編譯demo:

FROM ubuntu:18.04

USER root

COPY sources.list /etc/apt/sources.list

docker build . 當(dāng)前目錄執(zhí)行 可以看到執(zhí)行情況,一共分為三步

每條指令創(chuàng)建一層:

此時(shí)通過(guò)docker images就可以看到我們編好的鏡像了,好了正式進(jìn)入正題了。

from命令幫助我們找尋原始鏡像

第一行:FROM ubuntu:18.04 from本質(zhì)上等效于 docker pull命令,我們可以使用本地鏡像,也可以指定鏡像源,用如下

????FROM registry.hub.docker.com/library/ubuntu:18.04???

執(zhí)行效果:

對(duì)于國(guó)內(nèi)鏡像源大家可以從此文獲?。?https://segmentfault.com/a/1190000023117518

使用RUN命令安裝工具代替我們?cè)谌萜鲌?zhí)行命令:

RUN apt update 不要在腳本中使用apt命令,如果在腳本中使用apt命令,有可能會(huì)得到"WARNING: apt does not have a stable CLI interface. Use with caution in scripts." 提示。請(qǐng)使用apt-get、apt-cache等命令進(jìn)行替換。apt命令不適合在腳本中運(yùn)行,因?yàn)閍pt命令是為用戶(人)而設(shè)計(jì)的,它會(huì)有顏色的顯示、進(jìn)度條顯示等一些友好的交互界面。而在腳本中,對(duì)于這些“特性”是不穩(wěn)定(不支持或者是輸出錯(cuò)亂等)的。

WARNING:?apt?does?not?have?a?stable?CLI?interface.?Use?with?caution?in?scripts.

修改為RUN apt-get update

此外我們可以進(jìn)行命令一次執(zhí)行完成

RUN?apt-get?update
RUN?apt-get??--fix-broken?install
RUN??apt-get?install?-y?gcc?\
????zip\
????curl\
????python\
????kmod\
????openssh-server\
????sudo

安裝之后進(jìn)行 設(shè)置一個(gè)賬戶

RUN?groupadd?-g?1011?lyn
RUN?useradd?-d?/home/lyn?-m?-s?/bin/bash?-u?1010?-g?lyn?lyn

RUN?mkdir?-p?/home/lyn/work\
&&chown?-R?lyn:lyn?/home/lyn

RUN?echo?"lyn?ALL=(ALL)????ALL"?>?/etc/sudoers

RUN?echo?'root:root'?|?chpasswd?&&?echo?'lyn:lyn'?|?chpassswd

WORKDIR?/home/lyn/work

USER?lyn
COPY?.bashrc?/home/lyn/.bashrc

設(shè)置工具目錄,可以看到進(jìn)去之后工具目錄被設(shè)置為/home/lyn,通過(guò)WORKDIR /home/lyn/work執(zhí)行。

使用

docker images 看一下打包好的鏡像

看到有個(gè)沒(méi)有命名的包,就是我們剛剛編出來(lái)的

這個(gè)時(shí)候我們進(jìn)行改個(gè)名字

docker tag IMAGEID(鏡像id) REPOSITORY:TAG(倉(cāng)庫(kù):標(biāo)簽)

docker tag 025673a91e65 lyn_image:v1

啟動(dòng)使用 這個(gè)時(shí)候給大家介紹 volume命令

docker使用volume實(shí)現(xiàn)數(shù)據(jù)的持久化,不僅如此volume還能幫助容器和容器之間,容器和host之間共享數(shù)據(jù)。

我們可以使用dockerfile的VOLUME或者 docker run -v參數(shù) ,直接設(shè)置需要掛載的目錄。

在Dockerfile增加 VOLUME /home/lyn/work,開始編譯。

編譯完成后,首先通過(guò)docker inspect查看我們編譯好的鏡像信息或者容器信息:

docker inspect 47920709b10c 鏡像id進(jìn)行查看是否設(shè)置掛載目錄

docker inspect f4c2449431c5 啟動(dòng)之后的容器id

docker volume ls 可以看到當(dāng)前所有的volume

修改映射的文件夾內(nèi)容

sudo?touch?/var/lib/docker/volumes/567f9c362f6067b3b354bea8b0b370bf304b845ae18e38b125fbdaaface09cfb/_data/lyn.log

可以看到文件已經(jīng)同步過(guò)來(lái)了

同樣我們也可以使用 docker run -v進(jìn)行控制,首先注釋掉這句VOLUME /home/lyn/work,重新編譯鏡像

docker run -v /home/lyn/docker_share:/home/lyn/work [imageid] -v A:B A是在主機(jī)上的地址,B是在容器中的地址,這兩個(gè)地址如果不存在都會(huì)創(chuàng)建,一旦容器運(yùn)行,AB的會(huì)完全同步。

具體執(zhí)行為: docker run -it -v /home/lyn/docker_share:/home/lyn/work 208aca0306ab /bin/bash

關(guān)于volume更詳細(xì)的介紹大家可以看此文:https://docs.docker.com/engine/reference/commandline/volume_create/

寫了一個(gè)循環(huán)執(zhí)行的代碼,編譯成固件,用dockerfile 編譯讓鏡像自動(dòng)執(zhí)行

COPY hello_world /home/lyn/work

CMD ./hello_world

docker run -it 47920709b10c

最終的Dockerfile文件:

FROM?ubuntu:18.04

USER?root

COPY?sources.list?/etc/apt/sources.list

RUN?apt-get?update
RUN??apt-get?install?-y?gcc?\
????zip\
????curl\
????python\
????kmod\
????openssh-server\
????sudo


RUN?groupadd?-g?1011?lyn
RUN?useradd?-d?/home/lyn?-m?-s?/bin/bash?-u?1010?-g?lyn?lyn

RUN?mkdir?-p?/home/lyn/work?\
???&&chown?-R?lyn:lyn?/home/lyn

RUN?echo?"lyn?ALL=(ALL)????ALL"?>?/etc/sudoers

RUN?echo?'root:root'?|?chpasswd?&&?echo?'lyn:lyn'?|?chpasswd

WORKDIR?/home/lyn/work

USER?lyn
COPY?.bashrc?/home/lyn/.bashrc


VOLUME?/home/lyn/work

COPY?hello_world?/home/lyn/work

CMD?./hello_world

docker build執(zhí)行的log:因?yàn)橛羞^(guò)編譯了,所以這里好多執(zhí)行就是Using cache,很少的打印了

lyn@lyn:~/Documents/lyn_test/docker_build_ubuntu$?docker?build?.
Sending?build?context?to?Docker?daemon??28.16kB
Step?1/16?:?FROM?ubuntu:18.04
?--->?71eaf13299f4
Step?2/16?:?USER?root
?--->?Using?cache
?--->?d3fe45bd0e46
Step?3/16?:?COPY?sources.list?/etc/apt/sources.list
?--->?Using?cache
?--->?d4f825c3fc77
Step?4/16?:?RUN?apt-get?update
?--->?Using?cache
?--->?3863a99d6e2b
Step?5/16?:?RUN??apt-get?install?-y?gcc?????zip????curl????python????kmod????openssh-server????sudo
?--->?Using?cache
?--->?9b77c43d6709
Step?6/16?:?RUN?groupadd?-g?1011?lyn
?--->?Using?cache
?--->?bbba5f18057a
Step?7/16?:?RUN?useradd?-d?/home/lyn?-m?-s?/bin/bash?-u?1010?-g?lyn?lyn

?--->?Using?cache
?--->?47e999f10256
Step?8/16?:?RUN?mkdir?-p?/home/lyn/work????&&chown?-R?lyn:lyn?/home/lyn
?--->?Using?cache
?--->?36faf04c6390
Step?9/16?:?RUN?echo?"lyn?ALL=(ALL)????ALL"?>?/etc/sudoers
?--->?Using?cache
?--->?0422bf50db6b
Step?10/16?:?RUN?echo?'root:root'?|?chpasswd?&&?echo?'lyn:lyn'?|?chpasswd
?--->?Using?cache
?--->?68da5bb15877
Step?11/16?:?WORKDIR?/home/lyn/work
?--->?Using?cache
?--->?b30d4dcd99f8
Step?12/16?:?USER?lyn
?--->?Using?cache
?--->?5dfa565d0c6a
Step?13/16?:?COPY?.bashrc?/home/lyn/.bashrc
?--->?Using?cache
?--->?f2b39d61f05b
Step?14/16?:?VOLUME?/home/lyn/work
?--->?Running?in?5482493ab221
Removing?intermediate?container?5482493ab221
?--->?0e359e093a4f
Step?15/16?:?COPY?hello_world?/home/lyn/work
?--->?ac326932752c
Step?16/16?:?CMD?./hello_world
?--->?Running?in?430cfd90ad30
Removing?intermediate?container?430cfd90ad30
?--->?fc180e4919da
Successfully?built?fc180e4919da

補(bǔ)充操作:

發(fā)現(xiàn)兩個(gè)鏡像的id相同,如果用docker rmi [鏡像id]它就不知道該如何刪除,我們可以用:

???Error?response?from?daemon:?conflict:?unable?to?delete?71eaf13299f4?(must?be?forced)?-?image?is?referenced?in?multiple?repositories
???

docker rmi 鏡像名:版本號(hào) 當(dāng)我建立錯(cuò)誤的鏡像之后,使用rmi進(jìn)行刪除

結(jié)語(yǔ)

這就是我自己的一些Dockerfile使用分享。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。

此外對(duì)于想要更加細(xì)節(jié)的dockerfile使用可以官網(wǎng)的文章: https://docs.docker.com/engine/reference/builder/

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

這篇文章:https://yeasy.gitbook.io/docker_practice/image/build

到此這篇關(guān)于Dockerfile建立一個(gè)自定義的鏡像執(zhí)行自定義進(jìn)程的文章就介紹到這了,更多相關(guān)Dockerfile自定義進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker-Compose?容器集群的快速編排方法

    Docker-Compose?容器集群的快速編排方法

    Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來(lái)對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API, 就可以在其上利用Compose來(lái)進(jìn)行編排管理,這篇文章主要介紹了Docker-Compose?容器集群的快速編排,需要的朋友可以參考下
    2022-07-07
  • 常用的8個(gè)應(yīng)用和中間件的Docker運(yùn)行示例詳解

    常用的8個(gè)應(yīng)用和中間件的Docker運(yùn)行示例詳解

    Portainer是一個(gè)輕量級(jí)的管理 UI ,可讓你輕松管理不同的 Docker 環(huán)境(Docker 主機(jī)或 Swarm 群集),這篇文章主要介紹了常用的8個(gè)應(yīng)用和中間件的Docker運(yùn)行示例,需要的朋友可以參考下
    2024-03-03
  • 使用Jenkins+docker打包部署后端服務(wù)的實(shí)現(xiàn)

    使用Jenkins+docker打包部署后端服務(wù)的實(shí)現(xiàn)

    本文主要介紹了使用Jenkins+docker打包部署后端服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • docker如何查詢鏡像版本信息

    docker如何查詢鏡像版本信息

    這篇文章主要介紹了docker如何查詢鏡像版本信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • docker啟動(dòng)jar包輸出日志的問(wèn)題以及解決

    docker啟動(dòng)jar包輸出日志的問(wèn)題以及解決

    這篇文章主要介紹了docker啟動(dòng)jar包輸出日志的問(wèn)題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用?docker?部署?APISIX的詳細(xì)介紹

    使用?docker?部署?APISIX的詳細(xì)介紹

    這篇文章主要介紹了使用?docker?部署?APISIX的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Docker數(shù)據(jù)存儲(chǔ)之tmpfs mounts詳解

    Docker數(shù)據(jù)存儲(chǔ)之tmpfs mounts詳解

    今天小編就為大家分享一篇關(guān)于Docker數(shù)據(jù)存儲(chǔ)之tmpfs mounts詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • centos下docker安裝及springboot遠(yuǎn)程發(fā)布docker的方法

    centos下docker安裝及springboot遠(yuǎn)程發(fā)布docker的方法

    這篇文章主要介紹了centos下docker安裝及springboot遠(yuǎn)程發(fā)布docker的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • docker?commit命令的具體使用

    docker?commit命令的具體使用

    本文主要介紹了docker?commit命令的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • liunx內(nèi)存滿了,docker中overlay2爆表解決方案

    liunx內(nèi)存滿了,docker中overlay2爆表解決方案

    這篇文章主要介紹了liunx內(nèi)存滿了,docker中overlay2爆表解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論