为什么Google Cloud Build会创建中间容器



有人能向我解释一下为什么Google Cloud Build会创建中间容器来运行命令吗?

Step #0 - "Build": Step 2/25 : ARG NODE_ENV
Step #0 - "Build":  ---> Running in 17281bea0e29
Step #0 - "Build": Removing intermediate container 17281bea0e29
Step #0 - "Build":  ---> a43229632036
Step #0 - "Build": Step 3/25 : ARG DB_NAME
Step #0 - "Build":  ---> Running in 04a199971761
Step #0 - "Build": Removing intermediate container 04a199971761
Step #0 - "Build":  ---> 3f15b2ad5662
Step #0 - "Build": Step 4/25 : ARG DB_USER
Step #0 - "Build":  ---> Running in 4fb95096aab1
Step #0 - "Build": Removing intermediate container 4fb95096aab1
Step #0 - "Build":  ---> 97c619b21472
Step #0 - "Build": Step 5/25 : ARG DB_PASSWORD
Step #0 - "Build":  ---> Running in 2280e3095a20
Step #0 - "Build": Removing intermediate container 2280e3095a20
Step #0 - "Build":  ---> a79acad9a411
Step #0 - "Build": Step 6/25 : ARG CLOUD_SQL_CONNECTION_NAME
Step #0 - "Build":  ---> Running in 1f63bde588f0
Step #0 - "Build": Removing intermediate container 1f63bde588f0
Step #0 - "Build":  ---> 8e22be5c6191
Step #0 - "Build": Step 7/25 : ENV NODE_ENV ${NODE_ENV}
Step #0 - "Build":  ---> Running in 6f5495791d72
Step #0 - "Build": Removing intermediate container 6f5495791d72
Step #0 - "Build":  ---> 2413826fa5f6
Step #0 - "Build": Step 8/25 : ENV DB_NAME ${DB_NAME}
Step #0 - "Build":  ---> Running in e3099226a900
Step #0 - "Build": Removing intermediate container e3099226a900
Step #0 - "Build":  ---> 68f11d7cee19
Step #0 - "Build": Step 9/25 : ENV DB_USER ${DB_USER}
Step #0 - "Build":  ---> Running in c1c3dc6ca115
Step #0 - "Build": Removing intermediate container c1c3dc6ca115
Step #0 - "Build":  ---> 5fd5610b2de5
Step #0 - "Build": Step 10/25 : ENV DB_PASSWORD ${DB_PASSWORD}
Step #0 - "Build":  ---> Running in 67c6ed7a56e7
Step #0 - "Build": Removing intermediate container 67c6ed7a56e7
Step #0 - "Build":  ---> 7c8ecb080c59
Step #0 - "Build": Step 11/25 : ENV CLOUD_SQL_CONNECTION_NAME ${CLOUD_SQL_CONNECTION_NAME}
Step #0 - "Build":  ---> Running in 8dddcddd80c0
Step #0 - "Build": Removing intermediate container 8dddcddd80c0
Step #0 - "Build":  ---> 789cc6e25b55
Step #0 - "Build": Step 12/25 : WORKDIR /usr/src/app
Step #0 - "Build":  ---> Running in 2c5e9083a8a5
Step #0 - "Build": Removing intermediate container 2c5e9083a8a5

每走一步,我都对Removing intermediate container ...感兴趣。这会影响构建的性能吗?

cloudbuild.yml

steps:
- name: gcr.io/cloud-builders/docker
args:
- build
- '--build-arg'
- NODE_ENV=$_NODE_ENV
- '--build-arg'
- DB_NAME=$_DB_NAME
- '--build-arg'
- DB_USER=$_DB_USER
- '--build-arg'
- DB_PASSWORD=$$DB_PASSWORD
- '--build-arg'
- CLOUD_SQL_CONNECTION_NAME=$_CLOUD_SQL_CONNECTION_NAME
- '--no-cache'
- '-t'
- '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
- .
- '-f'
- Dockerfile
id: Build
secretEnv:
- DB_PASSWORD
- name: gcr.io/cloud-builders/docker
...

Cloud Build使用Docker来执行构建。要理解Cloud Build创建中间容器的原因,首先必须了解Docker构建过程。

对于每个构建步骤,Cloud build都会执行一个Docker容器作为docker run的实例。每个步骤都在一个中间容器中进行处理。

";这些中间容器可能成功也可能失败。如果成功,中间容器将与上一个成功构建步骤中的映像合并,然后删除中间容器">

从性能角度来看,删除即时容器是构建过程的一部分,它有助于减小容器映像的大小。

已有一些文章进一步解释了Docker的构建过程。这里有一些有趣的链接:

  • 中间容器是如何形成的
  • https://blog.hipolabs.com/understanding-docker-without-losing-your-shit-cf2b30307c63
  • https://medium.com/ihme-tech/troubleshooting-the-docker-build-process-454583c80665

最新更新