
¡¾±àÕߵϰ¡¿±¾´ÎÌÖÂÛÖ÷Òª¶Ôdocker buildµÄÔ´ÂëÁ÷³Ì½øÐÐÁËÊáÀíºÍ½â¶Á£¬²¢·ÖÏíÁËÔÚÖÆ×÷Dockerfile¹ý³ÌÖеÄһЩʵ¼ù¾Ñ飬°üÀ¨ÈçºÎµ÷ÊÔ¡¢ÓÅ»¯ºÍbuildÖеÄһЩҪµã¡£ÁíÍ⣬»¹Õë¶ÔÏÖÓÐDockerfileµÄ²»×ã½øÐÐÁ˼òҪ˵Ã÷£¬²¢·ÖÏíÁ˶ÔÓÚDockerfileµÄһЩÀí½â¡£
ÌýÖÚ
Õâ´ÎµÄ·ÖÏíÖ÷ÒªÃæÏòÓÐÒ»¶¨Docker»ù´¡µÄ¡£ÎÒÏ£ÍûÄãÒѾ£º
ÓùýDocker£¬ÊìϤdocker commitÃüÁî
×Ô¼º¶¯ÊÖ±àд¹ýDockerfile
×Ô¼º¶¯ÊÖbuild¹ýÒ»¸ö¾µÏñ£¬ÓÐÇ×ÉíµÄÌåÑé
ÎÒÖ÷Òª·ÖÏíһЩÏÖÔÚÍøÉÏ»òÕßÎĵµÖÐûÓеĶ«Î÷£¬°üÀ¨ÎÒµÄÀí½âºÍһЩʵ¼ù£¬ÓÐÎóÖ®´¦Ò²Çë´ó¼ÒÖ¸Õý¡£ºÃÁË£¬ÕýÎÄ¿ªÊ¼£º
Dockerfile
DockerfileÆäʵ¿ÉÒÔ¿´×öÒ»¸öÃüÁ¡£Ã¿ÐоùΪһÌõÃüÁÿÐеĵÚÒ»¸öµ¥´Ê£¬¾ÍÊÇÃüÁîcommand¡£ºóÃæµÄ×Ö·û´®ÊǸÃÃüÁîËùÒª½ÓÊյIJÎÊý¡£±ÈÈçENTRYPOINT /bin/bash¡£ENTRYPOINTÃüÁîµÄ×÷ÓþÍÊǽ«ºóÃæµÄ²ÎÊýÉèÖÃΪ¾µÏñµÄentrypoint¡£ÖÁÓÚÏÖÓÐÃüÁîµÄº¬Ò壬ÕâÀï²»ÔÙÏêÊö¡£DockOneÉÏÓкܶàµÄ½éÉÜ¡£
Docker¹¹½¨£¨docker build£©
docker buildµÄÁ÷³Ì
docker buildµÄÁ÷³Ì£¨Õⲿ·Ö´úÂë»ù±¾¶¼ÔÚdocker/builderÖУ©
ÌáÈ¡Dockerfile£¨evaluator.go/RUN£©¡£
½«Dockerfile°´ÐнøÐзÖÎö£¨parser/parser.go/Parse£© Dockerfile£¬Ã¿ÐеÚÒ»¸öµ¥´Ê£¬ÈçCMD¡¢FROMµÈ£¬Õâ¸ö½Ð×öcommand¡£¸ù¾Ýcommand£¬½«Ö®ºóµÄ×Ö·û´®ÓöÔÓ¦µÄÊý¾Ý½á¹¹½øÐнÓÊÕ¡£
¸ù¾Ý·ÖÎöµÄcommand£¬ÔÚdispatchers.goÖÐÑ¡Ôñ¶ÔÓ¦µÄº¯Êý½øÐд¦Àí£¨dispatchers.go£©¡£
´¦ÀíÍêËùÓеÄÃüÁÈç¹ûÐèÒª´ò±êÇ©£¬Ôò¸ø×îºóµÄ¾µÏñ´òÉÏtag£¬½áÊø¡£
ÔÚÕâÀÎÒ¾ÙÒ»¸öÀý×ÓÀ´ËµÃ÷Ò»ÏÂÔÚµÚ4²½ÃüÁîµÄÖ´Ðйý³Ì¡£ÒÔCMDÃüÁîΪÀý£º
func cmd(b *Builder, args []string, attributes map[string]bool, original string) error { cmdSlice := handleJsonArgs(args, attributes)
if !attributes["json"] {
cmdSlice = append([]string{"/bin/sh", "-c"}, cmdSlice...)
}
b.Config.Cmd = runconfig.NewCommand(cmdSlice...)
if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %q", cmdSlice));
err != nil {
return err
}
if len(args) != 0 {
b.cmdSet = true
}
return nil
} |
¿ÉÒÔ¿´µ½£¬b.Config.Cmd = runconfig.NewCommand(cmdSlice...)¾ÍÊǸù¾Ý´«ÈëµÄCMD£¬¸üÐÂÁËBuilderÀïÃæµÄConfig¡£È»ºó½øÐÐb.commit¡£BuilderÕâÀïµÄcommit´óÖº¬ÒåÆäʵÓëdocker/daemonµÄcommit¹¦ÄÜ´óͬСÒì¡£²»¹ýÕâÀïcommitÊǰüº¬ÁËÒÔϵÄÒ»¸öÍêÕû¹ý³Ì(²Î¼ûinternals.go/commit)£º
- ¸ù¾ÝConfig£¬createÒ»¸öcontainer³öÀ´¡£
-
È»ºó½«Õâ¸öcontainerͨ¹ýcommit(Õâ¸öcommitÊÇÖ¸µÄdockerµÄcommit,Óëdocker commitµÄÃüÁîÊÇÏàͬµÄ)µÃµ½Ò»¸öеľµÏñ¡£
-
²»½ö½öÊÇCMDÃüÁ¼¸ºõËùÓеÄÃüÁî(³ýÁËFROMÍâ)£¬ÔÚ×îºó¶¼ÊÇʹÓÃb.commitÀ´²úÉúÒ»¸öеľµÏñµÄ¡£
ËùÒÔÕâ»áµ¼ÖµĽá¹û¾ÍÊÇ£¬DockerfileÀïÿһÐУ¬×îºó¶¼»á±äΪ¾µÏñÖеÄÒ»²ã¡£¼¸ºõÊÇÓжàÉÙÓÐЧÐУ¬¾ÍÓжàÉٲ㡣
DockerfileÄæÏò
ͨ¹ýdocker history image¿ÉÒÔ¿´µ½¸Ã¾µÏñµÄÀúÊ·À´Ô´¡£¼´Ê¹Ã»ÓÐDockerfile£¬Ò²¿ÉÒÔͨ¹ýhistoryÀ´ÄæÏò²úÉúDockerfile¡£
[root@jd ~]# docker history 2d8 IMAGE CREATED CREATED BY SIZE 2d80e15fcfdb 8 days ago /bin/sh -c #(nop) COPY dir:86faa820e8bf5dcc06 16.29 MB 0f601e909d72 8 days ago /bin/sh -c #(nop) ENTRYPOINT [hack/dind] 0 B 68aed19c5994 8 days ago /bin/sh -c set -x && git clone https://githu 3.693 MB ebc6ef15552b 8 days ago /bin/sh -c #(nop) ENV TOMLV_COMMIT=9baf8a8a9f 0 B fe22e308201a 8 days ago /bin/sh -c set -x && git clone -b v1.0.1 htt 5.834 MB f514c504c9b1 8 days ago /bin/sh -c #(nop) COPY dir:d9a19910e57f47cb3b 3.114 MB e4e3ec8edf1a 8 days ago /bin/sh -c ./contrib/download-frozen-image.sh 1.155 MB 6250561532fa 8 days ago /bin/sh -c #(nop) COPY file:9679abce578bcaa2c 3.73 kB ... |
ÀýÈç0f601e909d72¾ÍÊÇÓÉENTRYPOINT [hack/dind]²úÉú¡£ÕâÀïµÄÐÅϢչʾµÄ²»ÍêÈ«£¬¿ÉÒÔͨ¹ýdocker inspect -f {{.ContainerConfig.Cmd}} layerÀ´¿´Ä³Ò»²ã²úÉúµÄ¾ßÌåÐÅÏ¢¡£
ÈçºÎ×öDockerfile
Dockerfileµ÷ÊÔ
Dockerfile¸ü¶àµÄÏñÒ»¸ö½Å±¾£¬ÀàËÆÓÚ°²×°½Å±¾¡£ÌرðÊÇ´óÆª·ùµÄ½Å±¾£¬ÏëÒ»´Îд³ÉÊDZȽÏÓÐÄѶȵġ£Ãâ²»Á˽øÐÐһЩµ÷ÊÔ¡£µ÷ÊÔʱ×îºÃÀûÓÃDockerfileµÄcache¹¦ÄÜ£¬¿ÉÒÔ´ó·ù¶È½ÚÔ¼µ÷ÊÔµÄʱ¼ä¡£
¾Ù¸öÀý×Ó£¬Èç¹ûÎÒÏÖÔÚÓÐÒ»¸öDockerfile¡£µ«ÊÇÎÒ·¢ÏÖ¡£ÎÒ»¹ÐèÒªÔÙ¿ª¼¸¸ö¶Ë¿Ú£¬»òÕßÔÙ°²×°ÆäËûµÄÈí¼þ¡£Õâ¸öʱºò×îºÃ²»ÒªÖ±½ÓÐÞ¸ÄÒѾÓеÄDockerfileµÄÄÚÈÝ¡£¶øÊÇÔÚºóÃæ×·¼ÓÃüÁî¡£ÕâÑùÔÙbuildµÄʱºò£¬¿ÉÒÔÀûÓÃÒÑÓеÄcache¡£
DockerfileÓÅ»¯
µ÷ÊÔ¹ýºóµÄDockerfileµ±È»¿ÉÒÔ×÷Ϊ×îÖÕµÄDockerfile£¬Ìṩ¸øÓû§¡£µ«Êǵ÷ÊÔµÄDockerfileµÄȱµã¾ÍÊDzãÊý¿ÉÄܹý¶à£¬¶øÇÒ²»Ò×Ô½¶à¡£ËùÒÔ×îºÃ½øÐÐÒ»¶¨µÄÓÅ»¯ºÍÕûÀí¡£¾¹ýÕûÀíµÄDockerfileÉú³É³öÀ´µÄ¾µÏñ¿ÉÒÔʹµÃ²ãÊý¸üÉÙ£¬ÌõÀí¸üÇåÎú£¬Ò²¿ÉÒÔ¸üºÃµÄ¸´Óá£
DockerOneÀïÓÐһƪÎÄÕÂдµÃºÜºÃ£¬¿ÉÒԲο¼¡£
ÕâÀïÓÐÁ½µãҪǿµ÷£º
¾¡Á¿Éú³ÉÒ»¸öbase£ºÕâÑù±ãÓÚ°æ±¾µÄµü´úºÍ×÷Ϊ¹«ÓþµÏñ¡£
ÇåÎúµÄ×¢ÊÍ£ºÓÐһЩעÊÍ»á°ïÖú±ðÈËÀí½âÕâЩÃüÁîµÄÄ¿µÄ
Dockerfile×Ô¶¯build
ÓÐÁËDockerfile£¬ºÜ¶àÈ˶¼ÊÇÔÚ±¾µØbuild¡£ÆäʵÕâ¸öÊÇÏ൱ºÄʱµÄ¡£Õâ¸ö¹¤×÷ÆäʵÍêÈ«¿ÉÒÔ½»¸øregistry.hub.docker.comÀ´Íê³É¡£
¾ßÌåµÄ×ö·¨¾ÍÊÇ£º
°ÑÄãµÄDockerfileÉÏ´«µ½GitHubÉÏ¡£
½øÈëµ½registry.hub.docker.comµÄ×Ô¼ºµÄÕË»§ÖУ¬Ñ¡ÔñAutomated Build¡£
È»ºó¾Í¿ÉÒÔbuildÁË¡£
¸ù¾ÝÄãµÄDockerfileÄÚÈÝ´óС£¬buildʱ³¤²»È·¶¨¡£µ«ÊÇÓ¦¸ÃËãÊDZȽϿìÁË¡£dockerÔ´ÂëµÄDockerfileÔÚÎÒ±¾µØbuildÁËÒ»¸ö¶àСʱ¡£µ«ÊÇregistry.hub.docker.comÖ»ÓÃÁ˰ëСʱ×óÓÒ¡£´óÔ¼ÊÇÒòΪÍâ¹úµÄÔÂÁÁ±È½ÏÔ²°É¡£
buildÍê³Éºó£¬¿ÉÒÔÔÚÏ߲鿴°æ±¾ÐÅÏ¢µÈ¡£±¾µØÐèÒªµÄ»°£¬¿ÉÒÔÖ±½ÓpullÏÂÀ´¡£
¹úÄÚÓжà¼Ò¹«Ë¾ÌṩÁËregistry.hub.docker.comµÄMirror·þÎñ£¬¿ÉÒÔÖ±½Ó´Ó¹úÄÚµÄÔ´ÖÐpullÏÂÀ´¡£ËÙ¶È¿ìºÜ¶à¡£
DockerfileµÄ²»×ã
²ãÊý¹ý¶à:¹ý¶àÐеÄDockerfile
²»ÄÜÇåÀívolumeµÈÅäÖãºvolume¡¢exposeµÈ¶à¸ö²ÎÊýÖ»Äܵ¥ÏòÔö¼Ó¡£²»ÄÜɾ³ý¡£±ÈÈçÔÚij¸ö¾µÏñ²ã¼ÓÈëÁËVOLUME /var/lib/docker¡£ÄÇôÔڸþµÏñÖ®ºóµÄËùÓв㽫¼Ì³ÐÕâÒ»ÊôÐÔ¡£
IMPORT¹¦ÄÜ
ÆäËû
ÏÖÔÚÎÒÃǻعýÍ·À´¿´DockerµÄ·Ö²ãµÄÁíÒ»¸ö¿ÉÄܵÄÓÃ;¡£
DockerµÄ¾µÏñ¿ÉÒÔ¿´×öÊÇÒ»¸öÈí¼þÕ»¡£ÄÇôÆäÖÐÓжà¸öÈí¼þ×é³É¡£ºÃÁË£¬ÄÇôÎÒÃÇÊDz»ÊÇ¿ÉÒÔ¿¼ÂÇÈÃÈí¼þ½øÐÐ×ÔÓɵþ¼ÓÄØ£¿
±ÈÈ磺´ÓCentOS¾µÏñÉϰ²×°ÁËPythonÐγɾµÏñA£¬´ÓCentOS¾µÏñÉϰ²×°ÁËApacheÐγɾµÏñB¡£Èç¹ûÓû§Ïë´ÓCentOSÉÏÐγÉÒ»¸ö¼ÈÓÐPythonÓÖÓÐApacheµÄ¾µÏñ£¬ÈçºÎ×öÄØ£¿
ÎÒÏëÓÐÁ½ÖÖ·½Ê½£¬Ò»ÖÖÊÇdockerfileµÄimport¡£ÎÒÃÇ¿ÉÒÔ»ùÓÚ¾µÏñA£¬È»ºóimport°²×°ApacheµÄDockerfile£¬´Ó¶øµÃµ½Ä¿±ê¾µÏñ¡£
ÁíÍâÒ»ÖÖÊÇ¿ÉÒÔÖ±½ÓÒýÈ룬¾ÍÊÇ»ùÓÚ¾µÏñA£¬È»ºóÎÒÃÇÖ±½Ó°ÑBµÄ×îºóÒ»²ã£¨¼ÙÉèB°²×°apacheÖ»ÐγÉÁËÒ»²ã£©£¬°áµ½¾µÏñAµÄ×Ó²ãÉÏ£¬²»ÊÇÒ²¿ÉÒԵõ½Ä¿±ê¾µÏñô£¿
ÒÔÉÏÖ÷ÒªÊÇÎÒ·ÖÏíµÄһЩÄÚÈÝ¡£´ó¼Ò¿ÉÒÔÒ»ÆðÀ´ÌÖÂÛ¡£
|