当前位置: 首页 > 知识库问答 >
问题:

比特桶管道 - 如何将同一个 Docker 容器用于多个步骤?

颜新
2023-03-14

我已经使用下面的配置为我的web应用程序设置了连续部署(bitbucket-pipelines.yml)。

pipelines:
  branches:
    master:
        - step:
            name: Deploy to production
            trigger: manual
            deployment: production
            caches:
              - node
            script:
              # Install dependencies
              - yarn install
              - yarn global add gulp-cli

              # Run tests
              - yarn test:unit
              - yarn test:integration

              # Build app
              - yarn run build

              # Deploy to production
              - yarn run deploy

虽然这有效,但我想通过并行运行单元和集成测试步骤来提高构建速度。

pipelines:
  branches:
    master:
        - step:
            name: Install dependencies
            script:
              - yarn install
              - yarn global add gulp-cli

        - parallel:
            - step:
                name: Run unit tests
                script:
                  - yarn test:unit
            - step:
                name: Run unit tests
                script:
                  - yarn test:integration

        - step:
            name: Build app
            script:
              - yarn run build

        - step:
            name: Deploy to production
            trigger: manual
            deployment: production
            script:
              - yarn run deploy

这还有一个优点,就是可以看到比特桶中的不同步骤,包括每一步的执行时间。

这是行不通的,因为每个步骤都创建了一个干净的Docker容器,并且测试步骤上不再安装依赖项。

我知道我可以使用工件在步骤之间共享文件,但这仍然需要创建多个容器,这会增加总执行时间。

如何在多个步骤之间共享同一个 Docker 容器?

共有3个答案

孟正志
2023-03-14

我推荐的可能解决方案:

  - step:
        name: Install dependencies
        script:
          - yarn install
          - yarn global add gulp-cli

上面的第一步应该是在预构建的 Docker 容器中,该容器托管在 Docker Hub 上,并通过映像用于部署:用户名/部署 docker:latest

然后,这两个步骤都可以使用这个容器进行测试。

印辉
2023-03-14

每个步骤都在自己的Docker容器和自己的卷中运行。因此,您不能在同一个构建容器上运行两个步骤。

您是在尝试优化构建分钟消耗,还是构建完成需要多长时间?

如果您正在优化构建分钟数,请坚持您现在拥有的。由于使用多个步骤和工件的开销会增加一些构建时间。但您将失去这些特性提供的灵活性。此外,您可以尝试确保在构建环境中使用小Docker映像,因为这样可以更快地完成。

如果您正在优化管道完成时间,我建议您使用工件和并行步骤。虽然总的执行时间预计会更长,但您将等待更短的时间来查看管道的结果。

梁成双
2023-03-14

我不久前遇到了同样的问题,并找到了一种方法来做到这一点,我现在正在成功地使用它。

您可以使用Docker的saveloadwith BitBucket的Artifacts来实现这一点。您只需要确保您的图像不会太大,因为BitBucket的Artifacts限制为1GB,您可以使用多阶段构建和其他技巧轻松确保这一点。

- step:
  name: Build app
  script:
  - yarn run build
  - docker save --output <backup-file-name>.tar <images-you-want-to-export>
  artifacts:
  - <backup-file-name>.tar
- step:
  name: Deploy to production
  trigger: manual
  deployment: production
  script:
  - docker load --input <backup-file-name>.tar
  - yarn run deploy

您可能还想使用BitBucket的缓存,这样可以更快地构建Docker图像。例如,您可以使NPM包仅在package时安装。json纱线。锁定文件更改。

  • docker保存(docker 17):https://devdocs.io/docker~17/engine/reference/commandline/save/index
  • docker加载(docker 17):https://devdocs.io/docker~17/引擎/参考/命令行/负载/索引
  • BitBucket工件:https://confluence.atlassian.com/bitbucket/using-artifacts-in-steps-935389074.html
  • BitBucket管道缓存:https://confluence.atlassian.com/bitbucket/caching-dependencies-895552876.html

 类似资料:
  • 是否可以在分支之间共享步骤并仍然运行分支特定的步骤?例如,开发和发布分支具有相同的构建过程,但上传到单独的S3存储桶。 我看到了这篇文章(Bitbucket Pipelines-多个分支具有相同的步骤),但它的步骤是相同的。

  • 我试图建立一个jenkins多分支管道,在docker容器中运行我的所有代码验证步骤,然后构建docker映像并将其推出docker容器。 目前,我的 Jenkinsfile 看起来有点像这样(为了便于阅读,它精简了): 这里的问题是,我使用 dockerfile 代理的每个阶段,jenkins 都会尝试重建 docker 映像。这些阶段都被缓存了,但是发送构建上下文并实际处理所有内容仍然需要比我

  • 问题内容: 我需要使用单个任务队列和单个结果队列来启动许多工作程序。每个工人都应该以不同的goroutine开始。我需要等到所有工作人员都将完成并且任务队列将为空后再退出程序。我已经准备了goroutine同步的小例子。主要思想是我们将排队的任务计数,并等待所有工人完成工作。但是当前的实现有时会遗漏值。为什么会发生这种情况以及如何解决问题?示例代码: 问题答案: 使用sync.WaitGroup等

  • 我们有一个Kafka主题,有源源不断的数据。为了处理它,我们有一个无状态的Flink管道,它使用该主题并写入另一个主题。 我们是不是漏掉了什么?我们误会什么了吗?有没有更好的解决办法? 谢了!

  • 在Ubuntu 20.04上运行新的Docker 20.10.1。此版本包括对主机的支持。码头工人。Linux上dockerd中的内部 我在使用SSL证书的容器中运行了一系列服务,我想使用Telegraf(稍后发送到Grafana仪表板)检查证书是否过期。 所有带有网络接口和Telegraf的服务都运行在同一个Docker主机上。所有服务都在自己的网桥网络中。我想在端口9000上从Telegraf

  • PS:如果您想要Postgresql容器中的日志: