在Jenkins上构build和部署Docker需要越来越多的时间

我在一个在Jenkins中构build和部署的Docker容器中运行了一个小的.NET Core Web应用程序。 docker存储库通过docker托pipe。

最初,花费不到一分钟的时间来构build和部署容器。 但是随着时间的推移,每一次构build和部署都花费了越来越多的时间,现在已经达到了一个多小时。 这里有一些从日志开始有希望的相关部分:

从git中检出版本库:

... + ./build.sh + REPO=quay.io/my/dir + IMAGE=quay.io/my/dir:dddaca1fd347b1fabea342a6a65431b68f793ad4 + docker pull quay.io/my/dir Using default tag: latest latest: Pulling from my/dir Digest: sha256:9a654ad205764a668c1fc531c0972d1273b0920dc8282a8c7b6498482cee7975 Status: Image is up to date for quay.io/my/dir:latest + docker build -t quay.io/my/dir:dddaca1fd347b1fabea342a6a65431b68f793ad4 . Sending build context to Docker daemon 121.9 kB Sending build context to Docker daemon 121.9 kB ... 

推动docker形象,我想:

 ... + '[' true = true ']' + docker tag -f quay.io/my/dir:dddaca1fd347b1fabea342a6a65431b68f793ad4 quay.io/my/dir:latest + '[' true = true ']' + docker tag -f quay.io/my/dir:dddaca1fd347b1fabea342a6a65431b68f793ad4 quay.io/my/dir:latest-master + docker tag -f quay.io/my/dir:dddaca1fd347b1fabea342a6a65431b68f793ad4 quay.io/my/dir:master-62 + docker push quay.io/my/dir The push refers to a repository [quay.io/my/dir] (len: 26) ... 

那么时间主要是由以下几个方面:

 ... 7db029aae55d: Preparing 7db029aae55d: Pushing 7db029aae55d: Pushed 55d4937daea6: Preparing 55d4937daea6: Pushing 55d4937daea6: Pushed 7ed278cf0e04: Preparing 7ed278cf0e04: Pushing 7ed278cf0e04: Pushed master-49: digest: sha256:8ce1e...<more of the key>...90503 size: 21007 4c16f41d1cc1: Image already exists 8f1aae847e7a: Image already exists 28a352fdaf13: Image already exists 80151bfc7fc5: Image already exists 54c7eb98ce04: Preparing 54c7eb98ce04: Pushing 54c7eb98ce04: Pushed b1131d0b29bb: Preparing ... more of the same 

我是Docker的新手,希望得到某种帮助。 这是我的build.shDockerfile

build.sh

 #!/bin/bash -ex REPO=quay.io/my/dir IMAGE=$REPO:$GIT_COMMIT docker pull $REPO docker build -t $IMAGE . docker run --rm $IMAGE /bin/bash -c "cd /app/test/Project.Tests && dotnet test" if [ "$TAG_LATEST" = true ]; then docker tag -f $IMAGE $REPO:latest fi if [ "$TAG_LATEST_MASTER" = true ]; then docker tag -f $IMAGE $REPO:latest-master fi # $TAG defined prior to running script docker tag -f $IMAGE $REPO:$TAG docker push $REPO 

Dockerfile

 FROM microsoft/dotnet:1.1.1-sdk EXPOSE 5000 COPY . /app WORKDIR /app RUN cd src/Project && dotnet restore --configfile NuGet.config --no-cache RUN cd test/Project.Tests && dotnet restore --no-cache RUN dotnet build WORKDIR /app/src/Project CMD ["dotnet", "run", "--server.urls", "https://0.0.0.0:5000"] 

图像历史

 $ sudo docker history quay.io/my/dir IMAGE CREATED CREATED BY SIZE COMMENT 0e58e5457605 4 days ago /bin/sh -c #(nop) CMD ["dotnet" "run" "--s... 0B <missing> 4 days ago /bin/sh -c #(nop) WORKDIR /app/src/Project 0B <missing> 4 days ago /bin/sh -c dotnet build 782kB <missing> 4 days ago /bin/sh -c cd test/Project.Tests && dotn... 15.8MB <missing> 4 days ago /bin/sh -c cd src/Project && dotnet rest... 2.4MB <missing> 4 days ago /bin/sh -c #(nop) WORKDIR /app 0B <missing> 4 days ago /bin/sh -c #(nop) COPY dir:c9cbed0051facc2... 62kB <missing> 3 weeks ago /bin/sh -c #(nop) EXPOSE 5000/tcp 0B <missing> 4 weeks ago /bin/sh -c mkdir warmup && cd warmup ... 297MB <missing> 4 weeks ago /bin/sh -c #(nop) ENV NUGET_XMLDOC_MODE=skip 0B <missing> 4 weeks ago /bin/sh -c curl -SL $DOTNET_SDK_DOWNLOAD_U... 290MB <missing> 4 weeks ago /bin/sh -c #(nop) ENV DOTNET_SDK_DOWNLOAD... 0B <missing> 4 weeks ago /bin/sh -c #(nop) ENV DOTNET_SDK_VERSION=... 0B <missing> 4 weeks ago /bin/sh -c apt-get update && apt-get i... 1.64MB <missing> 4 weeks ago /bin/sh -c apt-get update && apt-get insta... 123MB <missing> 4 weeks ago /bin/sh -c apt-get update && apt-get insta... 44.6MB <missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:f4e6551ac34ab44... 124MB 

我通过更改build.sh文件中的最后一行来解决这个问题:

 docker push $REPO 

 docker push $REPO:$TAG 

我把整个资料库推回到每个版本的docker服务器,而不是只是我刚刚创build的图像。 每个构build将花费比最后一个更长的时间,因为存储库随着添加到其中的每个映像而增长。