Docker Build BattleDocker Meetup Tokyo #25 LT #dockertokyo@orisano
View Slide
Docker buildʹԿΛٻΊΔ͔
buildࣗମΛߴʹʂग़ྗ͞ΕΔimageΛখ͘͞ʂ
imageΛখ͘͢͞Δͷdocker push͢Δͱ͖ͷdocker pull͢Δͱ͖ͷͷߴԽʹͭͳ͕Δ
ࠓ͍ͨ͜͠ͱ
ͲͷΑ͏ʹ͘͢Δ͔ͲͷΑ͏ʹখ͘͢͞Δ͔
ͲͷΑ͏ʹ͘͢Δ͔• ίϚϯυͦͷͷΛ͘͢Δ• cacheΛޮ͔ͤΔ• ґଘͷͳ͍εςʔδΛฒྻͰ࣮ߦ͢Δ• ඞཁͳ͍εςʔδΛbuild͠ͳ͍
ίϚϯυͦͷͷΛ͘͢Δ
͘Ͱ͖ΔίϚϯυ͋Δ
Α͘ૺ۰͢Δ͘Ͱ͖ΔίϚϯυ
GitHub͔Β࣮ߦϑΝΠϧΛcurl or wgetͰऔಘ͢Δ
GitHub ReleaseS3S3Rangeϔομʔ͕͑Δ
ͭ·Γฒྻμϯϩʔυ͕Մೳ
github.com/orisano/rget
ڥʹΑΓ·͕͢5min -> 2min
cacheΛޮ͔ͤΔ
docker build͢ΔϚγϯ͕ಉҰͷ߹ಉҰͰͳ͍߹
cacheͷΈΛཧղ͢Δ
RUNจࣈྻ͕มΘΒͳ͍ݶΓجຊతʹcache͞ΕΔ
COPY, ADD͢ΔϑΝΠϧͷ༰͕มΘͬͨ߹Ҏ߱ͷRUNͷcache͕ഁغ
ͳͷͰlockfileͳͲΛઌʹίϐʔͯ͠install͚ͩͯ͠cacheͤ͞Δ
CI্Ͱbuild͢Δͱ͖ͳͲcache͕ͳ͍͜ͱ͕ଟ͍
docker save & loadordocker pulldocker build —cache-fromΛ͏
image͕େ͖͍/layer͕ଟ͍߹buildͷ΄͏͕ૣ͍͜ͱ͋Δ
image͕େ͖͍/layer͕ଟ͍߹buildͷ΄͏͕ૣ͍͜ͱ͋Δܭଌܾͯ͠ΊΔ
ґଘͷͳ͍εςʔδΛฒྻͰ࣮ߦ͢Δ
buildkitΛ͍ͬͯͩ͘͞ʂgithub.com/moby/buildkitexport DOCKER_BUILDKIT=1
ඞཁͳ͍εςʔδΛbuild͠ͳ͍
͓ͦΒ͘buildkitͰͰ͖Δ͕buildkit͕͑ͳ͍߹ʹ
github.com/orisano/targd• DockerfileͷASTΛऔಘ• ࢦఆ͞ΕͨεςʔδͷґଘεςʔδΛநग़• ґଘεςʔδ͚ͩͷDockerfileΛग़ྗ
github.com/orisano/targd
ͲͷΑ͏ʹখ͘͢͞Δ͔• multi stage buildΛ͏• RUNΛ·ͱΊΔ(?)• ͳͥେ͖͍͔ΛΔ
multi stage buildΛ͏
multi stage buildʹׂ͍ͭͯѪ
multi stage buildͰ͋Γ͕ͪͳٙ
࠷ऴతͳΠϝʔδ͕খ͘͞ͳΔ͔ΒͦΕ·Ͱͷεςʔδ࠷దԽ͠ͳͯ͘ྑ͍ʁ
ݸਓతʹNo
CI্Ͱbuild —cache-fromΛ͍ͬͯΔ߹࠷ऴεςʔδ͚ͩcache͢Δҙຯͳ͍
moby/moby/issues/34715
multi stage build࣌ʹcacheΛޮ͔͍ͤͨ߹લͷεςʔδ໌ࣔతʹpush͢Δ͔͠ͳ͍
݁ہpush͢ΔͷͰpush/pullͷίετ͕͔͔Δͯ͢ͷεςʔδΛฏʹখ͖͘͢͞(ݸਓͷݟղͰ͢)
RUNΛ·ͱΊΔ(?)
ͳΜͱͳ͘RUNΛ·ͱΊΔͱαΠζ͕খ͘͞ͳΔ(ͱࢥ͍ͬͯ·ͨ͠)
github.com/orisano/minid• DockerfileͷASTΛऔಘ• ࿈ଓ͢ΔRUN, COPY, ADD, ENVΛ࿈݁͢Δ• ݁ՌͷDockerfileΛग़ྗ
github.com/orisano/minid
ϨΠϠʔͷΦʔόʔϔου͕ݮΔ͔Βখ͘͞ͳΔʁ
͍͍͑
·ͣͲ͏͍͏ܗͰอଘ͞ΕͯΔ͔ΛΔ
aufs / overlayfs2
ετϨʔδυϥΠόʔͷৄࡉׂѪ
େࡶʹݴ͏ͱίϚϯυຖʹfsͷࠩΛ͍࣋ͬͯΔ
ͳͷͰRUNΛލ͍Ͱಉ͡ϑΝΠϧΛ͍͡ΔͱαΠζ͕ഒʹͳͬͨΓ͢Δ
RUNΛލ͍Ͱେ͖ͳҰ࣌ϑΝΠϧΛআͯ͠ޮՌ͕ͳ͍
ػցతʹRUNΛ·ͱΊΔͷޮՌ͕͋Δ
ͳͥେ͖͍͔ΛΔ
͍͔ͳΔνϡʔχϯάͰܭଌͤͣʹ͍͚ͬͯͳ͍
docker history
ͲͷϨΠϠʔ͕େ͖͍͔Θ͔Δ͚Ͳͳͥେ͖͍͔͔ΓͮΒ͍
github.com/orisano/dlayer• documentະඋ… Ӷҙ։ൃத• docker saveͰಘΒΕͨtarΛղੳ• layerͱcmdͷରԠΛͱΔ• layerͷࠩΛϑΝΠϧαΠζ͕େ͖͍ॱʹදࣔ
github.com/orisano/dlayer
࣮ࡍʹdlayerΛͬͯgolangެࣜalpineΠϝʔδͷαΠζΛݮΒͯ͠Έͨ
docker-library/golang/pull/232
·ͱΊ• ίϚϯυΛ͘Ͱ͖ͳ͍͔ߟ͑Δ• cacheΛཧղͯ͠༗ޮʹ׆͔͢ (CI or ϩʔΧϧ)• multi stage buildΛ͏ (ॏ͍stageΛcache͢Δ)• layerΛখ͘͢͞ΔͨΊʹੳ͢Δ• buildkitΛ͏!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
࡞ͬͨπʔϧ• github.com/orisano/rget• github.com/orisano/targd• github.com/orisano/minid• github.com/orisano/dlayer• ྑ͍ͱࢥͬͨΒελʔ͍͚ͯͨͩ͠ΔͱྭΈʹͳΓ·͢
͓͢͢Ίͷࢿྉ• https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#dockerfile-instructions• https://cloud.google.com/solutions/best-practices-for-building-containers