GoããDockeräžã®Elasticsearchã«æ¥ç¶ããéã«ãããã¯ãŒã¯ã®Sniffingã§ããã£ã
åé¡
Docker ã§ Elasticsearch ãèµ·åããŸãã
services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0 environment: - discovery.type=single-node ports: - 9200:9200 - 9300:9300
以äžã® Elasticsearch ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãå©çšããhttp://127.0.0.1:9200ãžæ¥ç¶ãã«è¡ããŸãã
c, err := elastic.NewClient() // ããã©ã«ãã§127.0.0.1:9200ãžæ¥ç¶ if err != nil { log.Println(err) }
no active connection found: no Elasticsearch node availableãšãšã©ãŒãšãªãæ¥ç¶ã§ããŸããã
ã¡ãªã¿ã«ä»¥äžã§ã¯æ¥ç¶ã§ããŸãã
res, err := http.Get("http://127.0.0.1:9200/?pretty=true")
解決ç
以äžã®ããã«elastic.SetSniff(false)ãåŒæ°ã«äžããã°ã Docker äžã® Elasticsearch ã«æ¥ç¶ã§ããŸãã
c, err := elastic.NewClient(elastic.SetSniff(false))
1 æé以äžããã§æéãæº¶ãããŠããŸããŸããã
åå
ããã©ã«ãã§ã¯ã¯ã©ã€ã¢ã³ããã¯ã©ã¹ã¿ã®å šããŒããèªåçã«èŠã€ãã«ãããããã®ããŒãã«ãªã¯ãšã¹ããæãã(Sniffing)ãããããã®ããŒãã¯å€éšããã¯çŽæ¥ã¢ã¯ã»ã¹ã§ããªãããæ¥ç¶ã«å€±æããŸãã

ããã§ååŸãããããŒããšã¯å
·äœçã«ã¯ä»¥äžã®ãªã¯ãšã¹ãã§ååŸãããŸãã
ãã®äŸã§ã¯ã172.18.0.3:9200ã«ã¢ã¯ã»ã¹ãã«ããããšã«ãªããŸããã127.0.0.1:9200ãéããªãã®ã§ãšã©ãŒã«ãªããŸãã
$ curl http://localhost:9200/_nodes/http\?pretty\=true
"nodes" : { "bzn5IyC2T3GJj_MGhdwyFQ" : { "transport_address" : "172.18.0.3:9300", "host" : "172.18.0.3", "ip" : "172.18.0.3", "build_type" : "docker", "http" : { "bound_address" : [ "0.0.0.0:9200" ], "publish_address" : "172.18.0.3:9200", "max_content_length_in_bytes" : 104857600 }
å®éã®ã³ãŒã
NewClientã¡ãœããå
ã®æ¡ä»¶åå²ã§ãã
æå¹ã®å Žåãsniffã¡ãœãããåŒã°ããŸãã
if c.snifferEnabled { // Sniff the cluster initially if err := c.sniff(ctx, c.snifferTimeoutStartup); err != nil { return nil, err } } else { // Do not sniff the cluster initially. Use the provided URLs instead. for _, url := range c.urls { c.conns = append(c.conns, newConn(url, url)) } }
sniffã¡ãœããå
ã§ã¯ããŒãæ
å ±ãååŸããsniffNodeã¡ãœãããããããã§ Docker å€ããã¯éä¿¡ã§ããªãPublishAddressãååŸããããšã§ä»åã®åé¡ãçºçããŸããã
func (c *Client) sniffNode(ctx context.Context, url string) []*conn { var nodes []*conn // Call the Nodes Info API at /_nodes/http req, err := NewRequest("GET", url+"/_nodes/http") // ãã®ãªã¯ãšã¹ãã§ããŒãæ å ±ãååŸãããããã§ Docker å€éšããã¢ã¯ã»ã¹ã§ããªãURLãååŸããŠããŸã if err != nil { return nodes } // ç¥ res, err := c.c.Do((*http.Request)(req).WithContext(ctx)) if err != nil { return nodes } defer res.Body.Close() var info NodesInfoResponse if err := json.NewDecoder(res.Body).Decode(&info); err == nil { if len(info.Nodes) > 0 { for nodeID, node := range info.Nodes { if c.snifferCallback(node) { if node.HTTP != nil && len(node.HTTP.PublishAddress) > 0 { url := c.extractHostname(c.scheme, node.HTTP.PublishAddress) // ããã§ããŒãæ å ±ãååŸããŠãã if url != "" { nodes = append(nodes, newConn(nodeID, url)) } } } } } } return nodes }
ã¯ã©ã€ã¢ã³ãã¯olivere/elasticãelastic/go-elasticsearchã
ã¹ã¿ãŒæ°ãæå€ã§ãããå®éã«elastic/go-elasticsearchããæ±ããããã£ãã®ã§ãã¡ããæ¡çšããŸããã
ãã«ããŒãã¿ãŒã³ã§ã¯ãšãªãäœæã§ããã®ãã·ã³ãã«ã§åãããããã§ãã
äŸãã°ãres, err := c.Search().Index(targetIndex).Query(multiMatchQuery).Size(1).Do(context.Background())ã®ããã«ã¯ãšãªãæžããŸãã
åè
CIäžã§ã®ãã«ãã¹ããŒãžãã«ãã«ããããã£ãã·ã¥æŽ»çšã®éã®åŒŸäžžãèŠã€ãããããããªã(Buildx, BuildKit)
éã®åŒŸäžž
以äžã§ãã£ãã·ã¥æŽ»çšããã«ããPush ããããªã«è¡ã£ãŠãããŸãã
$ docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS # Docker Hub ã ECR ã«ãã°ã€ã³ $ export DOCKER_CLI_EXPERIMENTAL=enabled # Buildxãæå¹ã«ãã $ docker buildx create --use --driver docker-container # ãã«ããŒãäœæ(ããããªããš--pushãªãã·ã§ã³ã䜿ããªã) $ docker buildx build \ --tag $IMAGE:latest \ # ã¿ã°ãä»äž --cache-from type=registry,ref=$IMAGE:cache \ # ãã£ãã·ã¥ã®Pullå ãæå®(ã¬ãžã¹ããªãæå®) --cache-to type=registry,ref=$IMAGE:cache,mode=max \ # ãã£ãã·ã¥ã®Pushå ãæå®(ã¬ãžã¹ããªãæå®)ãmode=maxã«ããäžéã€ã¡ãŒãžã®ãã£ãã·ã¥ãå«ãã --push \ # æçµã€ã¡ãŒãžã®Pushãè¡ã .
ã¯ããã«
ãããŸã§ãCI ã§ã®ãã«ãã¹ããŒãžãã«ãã®ãã£ãã·ã¥æŽ»çšã«ã€ããŠããŸããŸãªèšäºãæžããŠããŸããã
キャッシュのためにDockerビルドで中間イメージをタグ付けしレジストリにPushする - 🤖
GitHub Actionsを例にCI環境でのマルチステージビルドのキャッシュの活用について🐳 - 🤖
ãããã§ã¯äžéã¹ããŒãžã®ãã£ãã·ã¥ã«èŠåŽããŸããã åã ã®ã¹ããŒãžã«ã¿ã°ãä»äžãåã ã®ã¹ããŒãžã Push ããŠããŠãé¢åããããå¯èªæ§ãäœããªã£ãŠããŸããã
Buildxã®ããã¥ã¡ã³ããèªãæ©äŒããããç°¡åã«ãã«ãã¹ããŒãžãã«ãã§ãã£ãã·ã¥ã掻çšã§ããããã§ããã
ãã®æ©èœã¯Docker 19.03 ããå©çšå¯èœã§ãã
Buildx ãšã¯
Docker Buildx 㯠Docker ã³ãã³ããæ¡åŒµãã CLI ãã©ã°ã€ã³ã§ãããMoby BuildKit ãã«ããŒããŒã«ãããã«ããæäŸãããæ©èœã«å®å šå¯Ÿå¿ãããã®ã§ãã Docker ãã«ããšåæ§ã®ãŠãŒã¶ãŒæäœãæäŸããããã«ã¹ã³ãŒãåããããã«ããŒã€ã³ã¹ã¿ã³ã¹ãè€æ°ããŒããžã®åæãã«ããªã©ãæ°å€ãã®æ°æ©èœãæäŸããŸãã
å
ã
ãDocker ã«ã¯ BuildKit ã®äžéšã®æ©èœã¯å«ãŸããŠããŸããã
ããããBuildx ãå©çšããããšã§ãBuildKit ã®å
šãŠã®æ©èœãå©çšã§ããŸãã
Buildx ãbuildkitdãšãã BuildKit ããŒã¢ã³ãã³ã³ããã§ç«ã¡äžããŠããã§ãã«ããè¡ãããšã§å®çŸããŠããŸãã
Buildx ãªãã§ BuildKit ã䜿ãããšãããšã--cache-fromãªãã·ã§ã³ã¯å©çšã§ããŸããã--cache-toãªãã·ã§ã³ã¯å©çšã§ããŸããã§ããã
Buildx ãå©çšãããšã--cache-to type=registry,ref=$IMAGE:cache,mode=maxãšæžãããšã§äžéã¹ããŒãžã®ãã£ãã·ã¥ãå«ããŠå€éšã¬ãžã¹ããªã« Push ã§ããŸãã
以äžã§ãã£ãã·ã¥æŽ»çšããã«ããPush ããããªã«è¡ã£ãŠãããŸãã
$ docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS # Docker Hub ã ECR ã«ãã°ã€ã³ $ export DOCKER_CLI_EXPERIMENTAL=enabled # Buildxãæå¹ã«ãã $ docker buildx create --use # ãã«ããŒãäœæ(ããããªããš--pushãªãã·ã§ã³ã䜿ããªã) $ docker buildx build \ --tag $IMAGE:latest \ # ã¿ã°ãä»äž --cache-from type=registry,ref=$IMAGE:cache \ # ãã£ãã·ã¥ã®Pullå ãæå®(ã¬ãžã¹ããªãæå®) --cache-to type=registry,ref=$IMAGE:cache,mode=max \ # ãã£ãã·ã¥ã®Pushå ãæå®(ã¬ãžã¹ããªãæå®)ãmode=maxã«ããäžéã€ã¡ãŒãžã®ãã£ãã·ã¥ãå«ãã --push \ # æçµã€ã¡ãŒãžã®Pushãè¡ã .
å®éã« GitHub Actions ã§äœ¿çšããŠããäŸã¯ä»¥äžã®ããã«ãªããŸãã
GitHub Actions ã§ã¯ããã§ Buildx ãå©çšã§ããŸãããã AWS CodeBuild ã§ã¯ Buildx ã䜿ããŸããã§ããã 以äžã®ããã«ããŠãCLI ãã©ã°ã€ã³ãå°å ¥ããå¿ èŠããããŸããã
$ export DOCKER_BUILDKIT=1 $ docker build --platform=local -o . git://github.com/docker/buildx $ mkdir -p ~/.docker/cli-plugins $ mv buildx ~/.docker/cli-plugins/docker-buildx
ãã®åŠçã«ãããªãŒããŒãããã倧ããã®ã§ãAWS CodeBuild ã§ã¯ Buildx ã䜿ãã®ã¯åŸ®åŠã§ããã
CodeBuild ã®ããŒã¹ã€ã¡ãŒãžã«æåãã Buildx å ããã°ããã®ã§ã¯ãšæããŸãããã
Unfortunately, we won't be adding any experimental features.
ãšèšãããŸããã
åè
Dockerfileãæžããã«Buildpacksã§å§åçã«è»œéãªDockerã€ã¡ãŒãžãäœæãã(539MB->245MB)
ã¯ããã«
2018 幎 10 æã« Cloud Native Buildpacks 㯠Cloud Native Computing Foundation (CNCF)ã« Sandbox ãšããŠåãå ¥ããããŸããã CNCF ã«ã¯ Kubernetes, Prometheus, Envoy, Fluentd ãªã©æåãããžã§ã¯ããå€ãåãå ¥ããããŠããŸãã Buildpacks ã䜿ãããšã§ãDockerfile ãæžããªããŠã Docker ã€ã¡ãŒãžãäœæã§ããŸãã ãŸããäœæãããã€ã¡ãŒãžã¯ããªã軜éã§ããã
詊ããŠã¿ã
ä»åã¯ã以äžã®ãªããžããªã® Java ã¢ããªã±ãŒã·ã§ã³ã® Docker ã€ã¡ãŒãžãäœæããŸãã github.com
ã€ã³ã¹ããŒã«
# Mac $ brew install buildpacks/tap/pack # Linux $ wget https://github.com/buildpacks/pack/releases/download/v0.12.0/pack-v0.12.0-linux.tgz $ tar xvf pack-v0.12.0-linux.tgz $ rm pack-v0.12.0-linux.tgz $ ./pack --help # Windows $ choco install pack --version=0.12.0
ãã¥ãŒããªã¢ã«ã«ããäŸ (301MB)
pack build <image-name>ã§ã€ã¡ãŒãžãäœæããŸãã
301MB ã®ã€ã¡ãŒãžãäœæãããŸããã
docker runã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããŸããã
$ pack build myapp --builder cnbs/sample-builder:bionic $ docker run -it -p 8080:8080 myapp:latest
ãã«ããŒã--builderã§æå®ããŸãã
ä»ã«ãããŸããŸãªãã«ããŒãéžæã§ããŸãã
Suggested builders:
Google: gcr.io/buildpacks/builder:v1 Ubuntu 18 base image with buildpacks for .NET, Go, Java, Node.js, and Python
Heroku: heroku/buildpacks:18 heroku-18 base image with buildpacks for Ruby, Java, Node.js, Python, Golang, & PHP
Paketo Buildpacks: gcr.io/paketo-buildpacks/builder:base Ubuntu bionic base image with buildpacks for Java, NodeJS and Golang
Paketo Buildpacks: gcr.io/paketo-buildpacks/builder:full-cf cflinuxfs3 base image with buildpacks for Java, .NET, NodeJS, Golang, PHP, HTTPD and NGINX
Paketo Buildpacks: gcr.io/paketo-buildpacks/builder:tiny Tiny base image (bionic build image, distroless run image) with buildpacks for Golang
spring-boot(2.3.0) ããã®æ°æ©èœ (245MB)
Java éå®ã®è©±ã«ãªããŸãããSpring Boot 2.3.0 ãã Buildpacks ãå
éšçã«äœ¿ã£ãŠããæ©èœãçµã¿èŸŒãŸããŸããã
mvn spring-boot:build-imageã§ Docker ã€ã¡ãŒãžãäœæã§ããŸãã
pom.xmlãç·šéããŠãã«ããããããžã§ã¯ãã® Spring Bootã®ããŒãžã§ã³ã 2.3.0 以äžãžã¢ããããŒãããŸãã
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
mvn spring-boot:build-imageã§ãã«ãã§ããŸãã
245MBãšæã軜éãªã€ã¡ãŒãžãäœæãããŸããã
docker runã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããŸããã
$ mvn spring-boot:build-image $ docker run -it -p 8080:8080 sample:0.0.1-SNAPSHOT
èªåã§ Doker Build (539MB)
èªåã§ Dockerfile ãæžãæ¹æ³ã§ãã ãã«ãã¹ããŒãžãã«ããå©çšããŠãã«ãããŠããä»ããéã539MB ã§ããã
FROM maven:3.6.3-jdk-8 as builder WORKDIR /apps/java-maven COPY pom.xml pom.xml RUN mvn dependency:resolve COPY src src RUN mvn package -DskipTests=true FROM openjdk:8 WORKDIR /apps/java-maven COPY --from=builder /apps/java-maven/target/sample-0.0.1-SNAPSHOT.jar /apps/java-maven/target/sample-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java", "-jar", "/apps/java-maven/target/sample-0.0.1-SNAPSHOT.jar"] EXPOSE 8080
éåžžéãã以äžã®ã³ãã³ãã§ãã«ãããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã
$ docker build -t self-build . $ docker run -it -p 8080:8080 self-build:latest
ãããã«
æ¬èšäºã§ã¯ Java ã§ã®äŸã§ããããGo,Node,Ruby,PHP,Python ãªã©ã§ããã°ãã«ãã§ããŸãã
pack build <image-name> --builder gcr.io/paketo-buildpacks/builder:tinyãªã©ã®ã³ãã³ãã§èšèªã«ãã£ããã«ããŒãæå®ããã°ãã«ãã§ããŸãã
èªåã§ Docker ãã«ããããå Žåã¯ã€ã¡ãŒãžã¯ 539MB ã§ããããBuildpacks ãå©çšããã° Dockerfile ãæžããªããŠãããäžã«ã€ã¡ãŒãžã¯ 245MB ã«ãªããŸããã
ãªãã§å°ãããªããã¯diveã§æ·±æãããããããã¥ã¡ã³ãèªãã ãããŠãŸãèšäºã«ããŸãã
— kotaroooo0 (@kotaroooo0) 2020幎8æ16æ¥
Docker ã§ç«ãŠã CI ã§ Docker Build ãã -Docker in Docker ãš /var/run/docker.sock
ã¯ããã«
CI ã§ã¯æ¯åãŸã£ãããªç°å¢ã§ãã¹ãããã«ããã§ããŸãã ããã«ã¯ãå€ã㯠Docker ãçšããããŠããŸãã ããã«ã¯ãDocker ã§å®çŸããããŸã£ãããªç°å¢ã§ã Docker ãã«ããªã© Docker ãå©çšã§ããŸãã
åæç¥è: Docker ã¯ã©ã€ã¢ã³ããš dockerd

アーキテクチャの理解 — Docker-docs-ja 1.11.0 ドキュメント
Docker ã³ãã³ããšdockerdã¯å¥ç©ã§ãAPI ã¯ã©ã€ã¢ã³ããš API ãµãŒããŒã®ãããªé¢ä¿ã§ãã
dockerdã¯ãDocker ããŒã¢ã³ã®ããšã§ãã
äŸãã°ãDocker for Mac ã§ã¯ãã®ãããªã€ã¡ãŒãžã§ãã
Docker 㯠Linux ã«ãŒãã«ãå¿
èŠãšãããããMac åäœã§ã¯åããŸããã
ããã§ãHyperKit ã䜿ã VM äžã« LinuxKit ãç«ã¡äžããŠããŸãã
Mac ã®ã¿ãŒããã«ãããLinuxKit ã® dockerd ã«åœä»€ãéã£ãŠããŸãã

CI ã§ã¯ Docker ã³ã³ããã§ Docker ã³ãã³ãã䜿ã
EC2 äžã§ Docker ã«ãã Jenkins ãåããæãªã©ã§ã¯ Docker ã³ã³ããå
ã§ Docker ã³ãã³ãã䜿ãå¿
èŠããããŸãã
docker build ã§ã€ã¡ãŒãžããã«ãããŠãdocker push ã§ã¬ãžã¹ããªã«ã€ã¡ãŒãžãããã·ã¥ããããšãå€ã
ãããŸãã
ã©ã®ããã«ã³ã³ããäžã§ Docker ãå©çšããã¹ãã§ããããã
docker in docker
docker in docker ã¯ä»¥äžã®ãããªã€ã¡ãŒãžã§ãã

docker in docker ã¯å ã ãDocker ã®éçºèªäœã®ããã«äœãããŸããã Docker ã€ã³ã¹ããŒã«æžã¿ã®ã³ã³ããã䜿çšãã³ã³ããå ã§ãã¹ããšã¯å¥ã« dockerd ãåããæ¹æ³ã§ãã dindãšäžè¬çã«åŒã°ããŠããŸãã
$ docker run --privileged --name dind -d docker:dind
--privileged ãªãã·ã§ã³ã«ãããã³ã³ããå
ãããã¹ãã®ãªãœãŒã¹ãæ±ããæš©å©ãæãããŸãã
GOOD
- ãã¹ãã® Docker ãšã¯å®å šã«å¥ç©ã® Docker ç°å¢ãå©çšå¯èœ
BAD
-privilegedã䜿ãå¿ èŠãããè匱æ§ããããŸã/var/lib/dockerãããŠã³ãããã®ã§ Data Volume ããã¡ã€ã«ãæºãŸã£ãŠãããŸã- CI ãåãã«ããè¡ãæãdind ã³ã³ãããåèµ·åãããã³ã«ãã®ãã£ãã·ã¥ãç¡å¹ã«ãªããŸã
/var/run/docker.sockãããŠã³ã
ãã¹ãã® dockerd ã®ãœã±ãããã¡ã€ã«ãããŠã³ãããŠãããã«åŠçããªã¯ãšã¹ãããŸãã ã€ã¡ãŒãžã¯ä»¥äžã§ãã

Docker out of Docker(dood)ãšåŒã°ããŸãã
GOOD
- dockerd ã¯ãã¹ãã®ãã®ã䜿ãã®ã§ãæ¯ååãã§ãããã£ãã·ã¥ãå©çšã§ããŸã
- ãã£ã¹ã¯ã¹ããŒã¹ãç¯çŽã§ããŸã
BAD
- ãã¹ãã§åããŠããä»ã®ã³ã³ãããèŠããŸã(å®å šã«ç¬ç«ããŠããªã)
- ãã¹ããã·ã³ã®ã«ãŒããåããŸã
$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock debian:jessie /bin/bash $ apt-get update && apt-get install wget -y && wget -qO- https://get.docker.com | sh $ docker images # ãã¹ãã®ã€ã¡ãŒãžã衚瀺ããã $ docker run -t -i -v /:/host debian:jessie /bin/bash $ chroot /host # ãã¹ãã®ã«ãŒããåãã
ã©ã£ã¡ã䜿ãã¹ã
EC2ãªã©ã§èªåã§CIãæ§æããå Žåã¯ãdoodã䜿ãã®ã奜ãŸããã§ãã ãŸããGitHub Actionsãªã©ã«ã¹ã¿ãã«CIãæäŸããå Žåã§ã¯ãdindã奜ãŸããã§ãã
åç §
ãã£ãã·ã¥ã®ããã«Dockerãã«ãã§äžéã€ã¡ãŒãžãã¿ã°ä»ããã¬ãžã¹ããªã«Pushãã
WHY: ãªãäžéã€ã¡ãŒãžãã¿ã°ä»ãããã®ã
ä»ã§ã¯ Docker ã€ã¡ãŒãžã®è»œéåã®ããã«ãã«ãã¹ããŒãžãã«ãã¯æ¬ ãããŸããã ããŒã«ã«ã§ã®å®è¡ã§ã¯åé¡ãããŸããããCI ç°å¢ãªã©ã® dockerd ãæ¯åºŠå€ãã Docker In Docker(dind)ã§ã¯åé¡ãèµ·ãããŸãã
æçµã€ã¡ãŒãžã®äžã«ãã«ãããã»ã¹ã®å
šãŠãå«ãŸããŠããã° 1 Dockerfile 1 Cache ã§åçŽãª--cache-from ãæå®ããã ãã§è¯ãã§ãã
ãã«ãã¹ããŒãžãã«ãã¯æçµã€ã¡ãŒãžã®è»œéåãç®çã§ãããããæçµã€ã¡ãŒãžã«ãã£ãã·ã¥ãã¹ãæ
å ±ã¯ã»ãšãã©å«ãŸããŠããããã£ãã·ã¥ããŠãç¡æå³ã§ãã
ãã£ãã·ã¥ãããã¹ããŒãžãæç€ºçã«--targetã§æå®ããŠããã«ããããã€ã¡ãŒãžãå€éšã«ä¿åããå¿
èŠããããŸãã
äŸãã°ã以äžã® Dockerfile ãèããŸãã
stage1ãšstage2ã¯ããã£ãã·ã¥ãããã§ãã
FROM alpine:latest as stage1 LABEL stage=1 WORKDIR /workdir RUN sleep 3 && touch stage1.txt FROM alpine:latest as stage2 LABEL stage=2 WORKDIR /workdir RUN sleep 6 && touch stage2.txt COPY --from=stage1 /workdir/stage1.txt /workdir/stage1.txt FROM alpine:latest as stage3 LABEL stage=3 WORKDIR /workdir COPY --from=stage1 /workdir/stage1.txt /workdir/stage1.txt COPY --from=stage2 /workdir/stage2.txt /workdir/stage2.txt
HOW: ã©ãäžéã€ã¡ãŒãžãã¿ã°ä»ãããã®ã
BuildKit ã䜿ã£ãŠãã«ãããå Žåãšããã§ãªãå Žåã§ããæ¹ãç°ãªããŸãã
ãŸããæçµã¹ããŒãžã«ã¯COPYã®ã¿ã®ããããã£ãã·ã¥ãå©çšããŸããã
BuildKit ãªã
Dockerfileã§LABELã䜿ãã©ãã«ä»ãããdocker imagesã§--filterãªãã·ã§ã³ã䜿ãããšã¿ã°ä»ãããã€ã¡ãŒãžãååŸã§ããŸãã
LABEL stage=1ã®ã¹ããŒãžãååŸããã«ã¯ã$(docker images --filter 'label=stage=1' -q | head -n 1)ãšããã°è¯ãã§ãã
export DOCKER_BUILDKIT=0 # ãã£ãã·ã¥ã®ããã«Pull # &ãšwaitã§äžŠåå®è¡ docker pull test:stage1 || true & docker pull test:stage2 || true & wait # ãã«ããã docker build --cache-from= . # äžéã€ã¡ãŒãžã«ã¿ã°ä»ããã docker tag $(docker images --filter 'label=stage=1' -q | head -n 1) test:stage1 docker tag $(docker images --filter 'label=stage=2' -q | head -n 1) test:stage2 # ãã£ãã·ã¥ã®ããã«Push # &ãšwaitã§äžŠåå®è¡ docker push test:latest & docker push test:stage1 & docker push test:stage2 & wait
ä»ã®éžæè¢
ãã®ããã«ããŠãã§ããŸãã ãã£ãã·ã¥ãå¹ãã®ã§ã¿ã°ä»ãã®ããã®ãã«ãã¯ããçµãããšã¯ãããäžã®ããæ¹ã®æ¹ãæ©ãã®ã§è¯ãã§ãã
# ãã«ããã docker build -t test:latest . # äžéã€ã¡ãŒãžã«ã¿ã°ä»ããã docker build -t test:stage1 --target stage1 --cache-from test:stage1 . docker build -t test:stage2 --target stage2 --cache-from test:stage2 .
BuildKit ãã
æè¿ã§ã¯ãBuildKit ã䜿ã£ãŠãã«ãããã®ãåœããåã«ãªã£ãŠããŸãã
BuildKit ã§ã¯DockerfileãããŒã¹ãã¹ããŒãžéã®äŸåé¢ä¿ãè§£éããããstage1ãšstage2ã䞊åã«ãã«ãã§ãããã«ãæéã®ççž®ã«ã€ãªãããŸãã
ããããBuildKit ã䜿ã£ããã«ãã§ã¯äžéã€ã¡ãŒãžãçæãããŸããã
docker imagesããŠããæçµã€ã¡ãŒãžãã衚瀺ãããŸããã
çç±ã¯åãããŸãããã容éãå§è¿«ããªãããã«ãããŠããããŠããã®ã§ããããã
ãã®ãããBuildKit ãªãã®å Žåã®ããã«ãdocker tagã«ããã¿ã°ä»ããã§ããŸããã
ãããã£ãŠãåå¥ã«ãã«ãããããšã«ãã£ãŠã¿ã°ä»ãããŸãã
export DOCKER_BUILDKIT=1 # ãã«ããã docker build -t test:latest --cache-from=test:stage1,test:stage2 --build-arg BUILDKIT_INLINE_CACHE=1 . # äžéã€ã¡ãŒãžã«ã¿ã°ä»ããã # &ãšwaitã§äžŠåå®è¡ docker build -t test:stage1 --target stage1 --cache-from test:stage1 --build-arg BUILDKIT_INLINE_CACHE=1 . & docker build -t test:stage2 --target stage2 --cache-from test:stage2 --build-arg BUILDKIT_INLINE_CACHE=1 . & wait # ãã£ãã·ã¥ã®ããã«Push # &ãšwaitã§äžŠåå®è¡ docker push test:latest & docker push test:stage1 & docker push test:stage2 & wait
--cache-fromã¯ãŸãã¬ãžã¹ããªããã¡ã¿ããŒã¿ã®ã¿ãååŸãããã£ãã·ã¥ãããã®å¯èœæ§ãããã¬ã€ã€ãŒã®ã¿ã Pull ããŸãã
BuildKit ã§æçµã¹ããŒãžãŸã§ãã«ãããŠããåå¥ã«ã¹ããŒãžããã«ããããšäžçªç¡é§ãå°ãªãã§ãã
ããŒã«ã䜿ãããšã§ç°¡åã«ãã«ãã¹ã¯ãªãããçæã§ããŸãã æçµã¹ããŒãžããã£ãã·ã¥ãããã©ãããªã©çްãããã¥ãŒãã³ã°ã¯äººã®æã§è¡ã£ãŠãã ããã
$ go get -u github.com/kotaroooo0/melancholy $ melancholy -i image_name # ----- Build image ----- docker build -t image_name:latest --cache-from=image_name:stage1,image_name:stage2,image_name:latest --build-arg BUILDKIT_INLINE_CACHE=1 . # ----- Attach tags ----- docker build -t image_name:stage1 --target=stage1 --build-arg BUILDKIT_INLINE_CACHE=1 . & docker build -t image_name:stage2 --target=stage2 --build-arg BUILDKIT_INLINE_CACHE=1 . & wait # ----- Push images ----- docker push image_name:stage1 & docker push image_name:stage2 & docker push image_name:latest & wait
Dockerã€ã¡ãŒãžåæããŒã«ãdiveããå©çšããŠDockerã€ã¡ãŒãžã軜éåãã
ã¯ããã«
Docker ã€ã¡ãŒãžãµã€ãºã¯å°ãããã°å°ããã»ã©ãPush ãš Pull ã®é«éåã«ã€ãªããå¬ããã§ãã
docker historyã«ãã£ãŠã€ã¡ãŒãžã¬ã€ã€ãŒããšã®ãµã€ãºã¯åãããŸãããã©ã®ã¬ã€ã€ãŒã®ã©ã®ãã¡ã€ã«ã®ãµã€ãºã倧ãããã¯åãããŸããã
$ docker history maven:3-amazoncorretto-11 IMAGE CREATED CREATED BY SIZE COMMENT eb8a5bbcd061 12 days ago /bin/sh -c #(nop) CMD ["mvn"] 0B <missing> 12 days ago /bin/sh -c #(nop) ENTRYPOINT ["/usr/local/b⊠0B <missing> 12 days ago /bin/sh -c #(nop) COPY file:2bbb488dd73c55d6⊠327B <missing> 12 days ago /bin/sh -c #(nop) COPY file:1b3da5c58894f705⊠1.65kB <missing> 12 days ago /bin/sh -c #(nop) ENV MAVEN_CONFIG=/root/.m2 0B <missing> 12 days ago /bin/sh -c #(nop) ENV MAVEN_HOME=/usr/share⊠0B <missing> 12 days ago |4 BASE_URL=https://apache.osuosl.org/maven/⊠11.3MB <missing> 12 days ago |4 BASE_URL=https://apache.osuosl.org/maven/⊠200MB <missing> 12 days ago /bin/sh -c #(nop) ARG BASE_URL=https://apac⊠0B <missing> 12 days ago /bin/sh -c #(nop) ARG SHA=c35a1803a6e70a126⊠0B <missing> 12 days ago /bin/sh -c #(nop) ARG USER_HOME_DIR=/root 0B <missing> 12 days ago /bin/sh -c #(nop) ARG MAVEN_VERSION=3.6.3 0B <missing> 12 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/jv⊠0B <missing> 12 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B <missing> 12 days ago |1 version=11.0.8.10-1 /bin/sh -c set -eux ⊠279MB <missing> 12 days ago /bin/sh -c #(nop) ARG version=11.0.8.10-1 0B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:788af9048b1c16334⊠163MB
dive
A tool for exploring a docker image, layer contents, and discovering ways to shrink the size of your Docker/OCI image.
ãã®ããŒã«ã§ã¯ãã¬ã€ã€ãŒããšã«ã©ã®ãã¡ã€ã«ã远å ã»åé€ãããã®ããã©ããããã®ãµã€ãºãªã®ããåãããŸãã Go ã§æžãããŠããŠã20000 ã¹ã¿ãŒãããã€ããŠããŸãã
ã€ã³ã¹ããŒã«
# brewã§ã€ã³ã¹ããŒã« $ brew install dive # go getã§ã€ã³ã¹ããŒã« $ go get github.com/wagoodman/dive
Dockerã§ãå®è¡ã§ãããä»ã®ã€ã³ã¹ããŒã«æ¹æ³ãREADMEã«æžããŠãããŸãã
äœ¿ãæ¹
# Analyze $ dive <your-image-tag> # Build & Analyze $ dive build -t <some-tag> .
以äžã®ã³ãã³ãã§ããŒã«ãèµ·åããŸãã ã¿ãŒããã«äžã§ããããã§ããã®ãTUIãšããããã§ãã
dive ã§è»œéå
ä»åã¯ãmaven:3-amazoncorretto-11ã軜éåããŸãã
dive ã®å®éã®äœ¿ãæ¹ã玹ä»ããªãã説æããŸãã
ãŸããäžã®ãªããžããªã®docker-maven/amazoncorretto-11/Dockerfileããã«ãããdiveãèµ·åããŸãã
$ docker build -t before-maven-amazoncorretto-11 .
$ dive before-maven-amazoncorretto-11

ãããªãç»é¢ã«ãããã衚瀺ãããŠæåã¯èš³ãããããªããšæããŸãã
- ç»é¢å·Šäž
Layers:ã©ã®ã¬ã€ã€ãŒãŸã§ã調æ»ãããéžæ - ç»é¢å·Šäž
Layer Details: ãã®ã¬ã€ã€ãŒã§ãªã«ãå®è¡ããŠãããã衚瀺 - ç»é¢å·Šäž
Image Details: ã€ã¡ãŒãžå šäœã®æ å ±ã衚瀺 - ç»é¢å³
Current Layer Contents:Layersã§æå®ããã¬ã€ã€ãŒã«å«ãŸããŠãããã¡ã€ã«ããªãŒããµã€ãºãšå ±ã«è¡šç€º
Tabã§LayersãšCurrent Layer Contentsãç§»åããªãã䜿ããŸãã
æåã¯ãã£ã¬ã¯ããªãéãããŠããŠç»é¢å³ã«ãã¡ã€ã«ããããã衚瀺ãããŠèŠã¥ããã®ã§ãSpaceã§ãã£ã¬ã¯ããªéããŠãããŸãã
^Spaceã§äžæ°ã«éããããããã§ãããMac ã®ã·ã§ãŒãã«ãããšè¡çªããŠäœ¿ããŸããã§ããã

èŠããããªããŸããã
Layersã§äžäžã«ç§»åãããšãããã«å¯Ÿå¿ããŠCurrent Layer Contentsãå€åããã£ã¬ã¯ããªããã¡ã€ãºã®ãµã€ãºã®å€åãåãããŸãã
Layersã確èªãããšããµã€ãºå€§ããå¢ããããã«ããã¯ãšãªãããã¬ã€ã€ãŒã¯äžãã 3 ã€ãšåãããŸãã
äžãã1 çªç®ãš 2 çªç®ã®ã¬ã€ã€ãŒã¯Amazon Linux ã®/usrãš amazoncorretto ã®/usr/lib/jvmã®è¿œå ã§ãããããã¯ããŒã¹ã€ã¡ãŒãžãªã®ã§æ¹åã§ããŸããã
äžãã3 çªç®ã¬ã€ã€ãŒã§ã¯ã/var/cache/yumã 82B ãã 195MB ãžå¢å ããŸããã
ãã®ã¬ã€ã€ãŒå
šäœã®ãµã€ãºã¯ 206MB ãªã®ã§ãã»ãšãã©ã/var/cache/yumãšåãããŸãã
é»è²ã¯éžæããã¬ã€ã€ãŒã«ãã£ãŠãµã€ãºãå€ãã£ãéšåã衚ããŠããŸãã

ãã®ã¬ã€ã€ãŒã§ã¯yum install -y tar which gzipãå®è¡ãããŠããŸãã
ãããã®ã³ãã³ãã¯å®è¡ã§ããã°åé¡ãªãã®ã§ 195MB ã®èšå€§ãªãã£ãã·ã¥ã¯äžèŠã§ãã
ãã®ããã« dive ãå©çšããããšã§äžèŠãªãã¡ã€ã«ãçºèŠããããšãã§ããŸããã ããšã¯ãDockerfile äžã§äžèŠãªãã¡ã€ã«ãåé€ããã°å®äºã§ãã
RUN yum install -y tar which gzip \ && rm -rf /var/cache/yum/* \ && yum clean all
ãã®ããã«ããã°ããã£ãã·ã¥ã¯åé€ã§ããŸãã
&&ã§ã€ãªããªããšäœèšãªã¬ã€ã€ãŒã远å ãããã ãã§è»œéåã«ã¯ç¹ãããŸããã
å
ã
ã®ã€ã¡ãŒãžãµã€ãºã¯ 659MB ã§ãããã倿ŽåŸã¯ 464MB ã«åæžããããšãã§ããŸããã
ã¡ããã©ã/var/cache/yumã® 195MB åã§ãã
ããã§ã®ä¿®æ£ã¯ãã«ãªã¯ãšã¹ããšããŠåºããŠããŒãžãããŸããã github.com
Mavenã®å ¬åŒDockerã€ã¡ãŒãžã«ã³ã³ããªãã¥ãŒãããŠOSSããã¥ãŒãããå¬ãã https://t.co/RxBbrRem5f
— kotaroooo0 (@kotaroooo0) 2020幎7æ28æ¥
ãããã«
diveã«ãã£ãŠã¬ã€ã€ãŒã®ãã£ã¬ã¯ããªããšããã¡ã€ã«ããšã«ãµã€ãºã®å€åã芳å¯ããããšãã§ããŸããã
ããªã匷åãªããŒã«ã ãªãšæããŸããã
欲ãèšããªããååé ã§ãœãŒãã§ã¯ãªããµã€ãºé ã§ãœãŒãã§ããããã«ãªã£ããã^Space ã§ãªãéãã³ãã³ãã§ãã£ã¬ã¯ããªãç³ãããå¬ãããšæããŸããã
ãŸããã³ãã³ãã«ãã£ãŠã©ããªãã¡ã€ã«ãçæããããåããããããããããã±ãŒãžãããŒãžã£ã®ã³ãã³ãããªã«ãããŠããããçè§£ãé²ããšããå¬ããå¯äœçšããããŸããã
ä»å㯠dive ã䜿ãã®ãååç®çã ã£ãã®ã§dive -> Dockerfileã®é ã§èŠãã®ã§ãããDockerfile -> diveã®é ã§èŠãã°yum installã®ãã£ãã·ã¥ãåé€ããã°ããããã ãªãšåœãããã€ããããšãã§ãããããããŸããã
ãŸãããå
¬åŒDockerã€ã¡ãŒãžã«ãããªã«ã·ã³ãã«ãªä¿®æ£ç®æãæ®ã£ãŠãããšã¯æããŸããã§ããã
å¶ç¶ã«ãOSSãžè²¢ç®ããããšãã§ãã©ãããŒã§ããã
éå»ã«æžãã Docker ãã«ãé¢ä¿ã®èšäº
GitHub Actionsを例にCI環境でのマルチステージビルドのキャッシュの活用について🐳 - 🤖
GitHub ActionsでのDockerビルドをキャッシュで高速化する - 🤖
Dockerfileを正しく書けるように指摘してくれる静的解析ツール「hadolint」 - 🤖
Dockerイメージのビルドで使うキャッシュの種類(レイヤーキャッシュ, BuildKit, CI) - 🤖
GitHub ActionsãäŸã«CIç°å¢ã§ã®ãã«ãã¹ããŒãžãã«ãã®ãã£ãã·ã¥ã®æŽ»çšã«ã€ããŠð³
ã¯ããã«
以åãCI ç°å¢ã§ã® Docker ãã«ãã®ãã£ãã·ã¥ã«ã€ããŠèšäºãæžããŸããã
ååã®èšäºã®ããã«ãã«ãã¹ããŒãžãã«ãã§ãªãå Žåã¯ã1 Dockerfile 1 Cache ã§åé¡ãããŸããã§ããã ããããä»ã§ã¯ Docker ã€ã¡ãŒãžã®è»œéåã®ããã«ãã«ãã¹ããŒãžãã«ãã¯æ¬ ãããŸããã ããŒã«ã«ã§ã®å®è¡ã§ã¯åé¡ãããŸããããdockerd ãæ¯åºŠå€ãã CI ç°å¢ã Docker In Docker(dind)ã§ã¯åé¡ãèµ·ãããŸãã
æçµã€ã¡ãŒãžã®äžã«ãã«ãããã»ã¹ã®å
šãŠãå«ãŸããŠããã° 1 Dockerfile 1 Cache ã§åçŽãª--cache-fromãæå®ããã ãã§è¯ãã§ãã
ãã«ãã¹ããŒãžãã«ãã¯æçµã€ã¡ãŒãžã®è»œéåãç®çã§ãããããæçµã€ã¡ãŒãžã«ãã£ãã·ã¥ãã¹ãæ
å ±ã¯ã»ãšãã©å«ãŸããŠããããã£ãã·ã¥ããŠãç¡æå³ã§ãã
ãã£ãã·ã¥ãããã¹ããŒãžãæç€ºçã«--targetã§æå®ããŠããã«ããããã€ã¡ãŒãžãå€éšã«ä¿åããå¿
èŠããããŸãã
ãã«ãã¹ããŒãžãã«ãã«ãªããšãã£ãã·ã¥ãé£ãããªããŸãã
詊ãéžæè¢
1.æ®éã®docker buildð
ãã£ãã·ã¥ãå¹ããªãæ®éã®docker build .ã§ãã
GitHub Actions ã¯æ¯å dockerd ãå€ããã¹ããŒãã¬ã¹ãªã®ã§ãã®ãŸãŸã§ã¯ã¬ã€ã€ãŒãã£ãã·ã¥ã¯å¹ããŸããã
2.æ®éã®docker build + BuildKitð¶
ð ãšåæ§ã§ãããBuildKit ãå¹ãããŸãã
ç°å¢å€æ°ã«DOCKER_BUILDKIT=1ãã»ãããdocker build .ããã ãã§ãã
3.actions/cache + docker save & load ðŠ
GitHub Actions ã§ã¯ãactions/cache ã䜿ãããšã§ãã£ãã·ã¥ã§ããŸãã
ãŸããdocker save ãšdocker loadã«ãããã€ã¡ãŒãžã tar 圢åŒã®ãã¡ã€ã«ã«ã»ãŒããããããŒãã§ããŸãã
4.å€éšã¬ãžã¹ããªã®ãã£ãã·ã¥docker build --cache-fromð·
ããã¯å€éšãã£ãã·ã¥ã§ãã
ä»å㯠Docker Hub ã§ãããAWS ã® ECR ãªã©ãžãåæ§ã«ãã£ãã·ã¥ã§ããŸãã
ããã«ããã¬ã€ã€ãŒãã£ãã·ã¥ãå¹ããŸãã
--build-arg BUILDKIT_INLINE_CACHE=1ã®ãªãã·ã§ã³ãå¿
é ã§ãã
ãã«ããŒã¯ã¬ãžã¹ããªããã¡ã¿ããŒã¿ã®ã¿ãååŸãããã£ãã·ã¥ãããã®å¯èœæ§ãããã¬ã€ã€ãŒã®ã¿ã pull ããŸãã
ãã®ãããäºåã«docker pullãããå¿
èŠã¯ãããŸããã
詊ããŠã¿ã
以äžã® Dockerfile ã§ä»åã¯è©ŠããŠã¿ãŸããã ååã® builder ã¹ããŒãžã§ Go ã®ãœãŒã¹ã³ãŒããããã€ããªãçæããŠãæçµã€ã¡ãŒãžã«ãã€ããªãã³ããŒããŠããŸãã
FROM golang:1.14-alpine as builder WORKDIR /go/src/github.com/kotaroooo0/snowforecast-twitter-bot/app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go build -o main FROM alpine:latest COPY --from=builder /go/src/github.com/kotaroooo0/snowforecast-twitter-bot/app/main /main COPY .env / EXPOSE 3000 ENTRYPOINT ["/main"]
1. æ®éã®docker build ð
.envãã¡ã€ã«ãäœæããŠããã®ã¯ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªããã§ãããæ¬è³ªçã«ã¯é¢ä¿ãããŸããã
build_no_cache:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@master
- name: Create .env file
run: echo "${{ secrets.GITHUBACTION_ENV }}" > .env
- name: Build
run: docker build .
48 ç§ã§ããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/886546983?check_suite_focus=true
2. æ®éã®docker build + BuildKit ð¶
DOCKER_BUILDKIT: 1ãšãããšãBuildKit ãæå¹ã«ãªããŸãã
build_no_cache_buildkit:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@master
- name: Create .env file
run: echo "${{ secrets.GITHUBACTION_ENV }}" > .env
- name: Build
env:
DOCKER_BUILDKIT: 1
run: docker build .
31 ç§ã§ããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/886567325?check_suite_focus=true
3.actions/cache + docker save & load ðŠ
build_with_docker_save_load: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@master - name: Create .env file run: echo "${{ secrets.GITHUBACTION_ENV }}" > .env # actions/cacheã䜿ãããã«pathãškeyãæå® - id: docker-cache-step uses: actions/cache@v1 with: path: /tmp/saveload-cache key: docker-saveload-${{ hashFiles('Dockerfile') }} # ãã£ãã·ã¥ããããªãdocker loadã§ã€ã¡ãŒãžãååŸ - run: docker load -i /tmp/saveload-cache/go-builder.tar || true if: steps.docker-cache-step.outputs.cache-hit == 'true' # ã®ã¡ã«docker saveãããããäžéã€ã¡ãŒãžã®ã¿ããã«ã # --cache-from=thing-cacheã«ããdocker loadã§èªã¿èŸŒãã ãã®ããã£ãã·ã¥ãšããŠå©çš - run: docker build . -t thing --target builder --cache-from=thing-cache # æçµã€ã¡ãŒãžããã«ã # äžéã€ã¡ãŒãžããã§ã«ãã«ãããŠããã®ã§ãã£ãã·ã¥ã¯å¹ã - run: docker build . --cache-from=thing-cache # äžéã€ã¡ãŒãžãdocker saveã§ä¿å - run: docker tag thing thing-cache && mkdir -p /tmp/saveload-cache && docker save thing-cache -o /tmp/saveload-cache/go-builder.tar && ls -lh /tmp/saveload-cache || true if: always() && steps.docker-cache-step.outputs.cache-hit != 'true'
ãã£ãã·ã¥ããããããªã 1 åç®ã¯ 1 å 8 ç§ã§ããã å ããŠããã£ãã·ã¥ãä¿åããã®ã«ããã« 45 ç§ããããŸããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/909479280?check_suite_focus=true
ãã£ãã·ã¥ããã«ã§ãããããå Žå㯠13 ç§ã§ããã å ããŠããã£ãã·ã¥ã®åŸ©å ã« 33 ç§ããããŸããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/909484937
ãã£ãã·ã¥ãäžéšããããããããªå€æŽ(main.goã®ä¿®æ£ãªã©)ãããå Žåã«ã©ãã ãæéãççž®ã§ããã調ã¹ãŸããã
ãã«ãèªäœã¯ 39 ç§ã§ããã
å ããŠããã£ãã·ã¥ã®åŸ©å
ã« 35 ç§ããããŸããã
https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/909488577?check_suite_focus=true
4.å€éšã¬ãžã¹ããªã®ãã£ãã·ã¥ docker build --cache-from ð·
cache-from-with-build-arg:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@master
- name: Create .env file
run: echo "${{ secrets.GITHUBACTION_ENV }}" > .env
- name: login
run: docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS
# æçµã€ã¡ãŒãžã¯ãã«ãããã»ã¹ã®ãã£ãã·ã¥ãå«ãã§ããªããããäžéã€ã¡ãŒãžããã«ãããŠããã·ã¥
- name: build builder image
run: docker build --target builder --cache-from $IMAGE:builder --tag $IMAGE:builder --build-arg BUILDKIT_INLINE_CACHE=1 .
- name: build image
run: docker build --cache-from $IMAGE:builder --cache-from $IMAGE:latest --tag $IMAGE:latest --build-arg BUILDKIT_INLINE_CACHE=1 .
# &ãšwaitã§äžŠåå®è¡
- name: push image
run: |
docker push $IMAGE:builder &
docker push $IMAGE:latest &
wait
ãã£ãã·ã¥ããããããªã 1 åç®ã¯ 35 ç§ã§ããã å ããŠããã£ãã·ã¥ãä¿åããã®ã«ããã« 6 ç§ããããŸããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/897778413
ãã£ãã·ã¥ããã«ã§ãããããå Žå㯠24 ç§ã§ããã å ããŠããã£ãã·ã¥ãä¿åããã®ã«ããã« 5 ç§ããããŸããã https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/897795622
ãã£ãã·ã¥ãäžéšããããããããªå€æŽ(main.goã®ä¿®æ£ãªã©)ãããå Žåã«ã©ãã ãæéãççž®ã§ããã調ã¹ãŸããã
ãã«ãèªäœã¯ 36 ç§ã§ããã
å ããŠããã£ãã·ã¥ã®ä¿åã« 9 ç§ããããŸããã
https://github.com/kotaroooo0/snowforecast-twitter-bot/runs/897844111?check_suite_focus=true
ãŸãšã

ð· ã§ãã£ãã·ã¥ããã«ãããããå Žåãæéã§ãããã®ãããªããšã¯çšã§ããã®ã§ããã£ãã·ã¥ãç¡çã«äœ¿ããã« BuildKit ã§ãã«ã ð¶ ããã®ãå®å®ããŠé«éã§ããå®çšçã§ãã
äžéã€ã¡ãŒãžã®ãã£ãã·ã¥ãå¹ããã ðŠð· ãæéãããã£ãŠããŸã£ãã®ã¯ãäžéã€ã¡ãŒãžã®ãµã€ãºã倧ããdocker save ã docker loadãdocker pull ã docker push ã«æéãããã£ãŠããŸãããã ãšèããããŸãã
äžéã€ã¡ãŒãžã¯ 200MB çšåºŠãææç©ã§ããæçµã€ã¡ãŒãžã¯ 10MB çšåºŠã§ãã
ãã£ãã·ã¥ãå¹ãããæºåããããããBuildKit ã§ãã£ããšãã«ãããæ¹ãè¯ããšããããšã§ãã
YAML ããã£ããããŠããŠè¯ãã§ãã
GCP ã® CloudBuild ã§ããã°ãGoogle 補ã®ã³ã³ããå ã§åãã³ã³ãããã«ããŒã® kaniko ãç°¡åã«äœ¿ããããã§è¯ãããã§ãã kaniko ãªãããã«ãã¹ããŒãžãã«ãã ãããšãªãã ãããšãã£ãã·ã¥ã®ããšãèããã«ããæãã«ãã«ãããŠãããŸãã GitHub Actions ã§ãå©çšã§ãããããããªã®ã§è©ŠããŠã¿ããã§ãã
CI äžã§ã®ãã«ãã¹ããŒãžãã«ãã®ãã£ãã·ã¥ã¯é£ããã§ãã
éå»ã«æžãã Docker ãã«ãé¢ä¿ã®èšäº
GitHub ActionsでのDockerビルドをキャッシュで高速化する - 🤖
Go製CLIツールを使うDockerイメージをダイエットしてみた - 🤖
DockerイメージのビルドをBuildKitで並列実行し高速化する - 🤖