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

Docker命令在BitBucket Pipeline的自定义管道中不可用

公孙森
2023-03-14

我正在执行一个构建步骤,该步骤处理 Docker Swarm 模式群集中的常见部署任务。由于这是我们和其他人的共同问题,因此我们将此构建步骤共享为 BitBucket 管道:https://bitbucket.org/matchory/swarm-secret-pipe/ 管道需要使用 docker 命令来处理远程 Docker 安装。但是,这不起作用,因为管道运行时找不到 docker 可执行文件。

以下内容适用于我们的测试存储库管道:

  • The docker option is set to true:
    options:
      docker: true
    
    main:
      - step:
        services:
          - docker: true
    
    docker container run \
      --volume=/opt/atlassian/pipelines/agent/build:/opt/atlassian/pipelines/agent/build \
      --volume=/opt/atlassian/pipelines/agent/ssh:/opt/atlassian/pipelines/agent/ssh:ro \
      --volume=/usr/local/bin/docker:/usr/local/bin/docker:ro \
      --volume=/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes:/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes \
      --volume=/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes/matchory/swarm-secret-pipe:/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes/matchory/swarm-secret-pipe \
      --workdir=$(pwd) \
      --label=org.bitbucket.pipelines.system=true \
      radiergummi/swarm-secret-pipe:1.3.7@sha256:baf05b25b38f2a59b044e07f4ad07065de90257a000137a0e1eb71cbe1a438e5
    

    管道是相当标准的,并且使用了最近的阿尔卑斯山图像;在这方面没有什么特别的。PATH永远不会被覆盖。现在是有趣的部分:如果我在管道内执行ls /usr/local/bin/docker,它会显示一个空目录:

    ls /usr/local/bin
    total 16K 
    drwxr-xr-x 1 root root 4.0K May 13 13:06 .
    drwxr-xr-x 1 root root 4.0K Apr 4 16:06 ..
    drwxr-xr-x 2 root root 4.0K Apr 29 09:30 docker
    ls /usr/local/bin/docker
    total 8K 
    drwxr-xr-x 2 root root 4.0K Apr 29 09:30 .
    drwxr-xr-x 1 root root 4.0K May 13 13:06 ..
    ls: /usr/local/bin/docker/docker: No such file or directory
    

    据我所知,管道和Docker,/usr/local/bin/Docker应该是Docker二进制文件。相反,由于某种原因,它似乎是一个空目录。这是怎么回事?

    我还查看了其他官方管道。它们没有任何不同,但似乎可以很好地使用docker命令(例如Azure管道)。

共有1个答案

邵浩大
2023-03-14

在与BitBucket支持人员交谈后,我解决了这个问题。事实证明,如果docker上下文发生变化,任何docker命令都会直接发送到远程docker二进制文件,该文件(在我们的服务上)位于与BitBucket管道不同的路径
由于我们在使用管道之前更改了docker上下文,并且安装到管道中的docker实例仍然具有远程上下文集,但管道在另一个位置搜索docker二进制文件,因此会抛出<code>无此类文件或目录</code>错误。

TL;DR:在将控制传递到管道之前,始终还原默认docker主机/上下文,例如:

script:
  - export DEFAULT_DOCKER_HOST=$DOCKER_HOST
  - unset DOCKER_HOST
  - docker context create remote --docker "host=ssh://${DEPLOY_SSH_USER}@${DEPLOY_SSH_HOST}"
  - docker context use remote

  # do your thing

  - export DOCKER_HOST=$DEFAULT_DOCKER_HOST # <------ restore the default host
  - pipe: matchory/swarm-secret-pipe:1.3.16
 类似资料:
  • 使装饰器包含具有name属性的管道元数据。 此值将用于在模板表达式中调用此管道。 它必须是有效的JavaScript标识符。 实现PipeTransform接口的transform方法。 此方法接受管道的值和任何类型的可变数量的参数,并返回一个变换的(“管道”)值。 import { Component } from '@angular/core'; selector: 'app-root',

  • 即。在货币管道上完成一些额外的格式化。为此,我想在自定义管道的组件代码中使用现有管道。

  • 本文向大家介绍Angular 2 全球可用的自定义管道,包括了Angular 2 全球可用的自定义管道的使用技巧和注意事项,需要的朋友参考一下 示例 要使自定义管道在整个应用程序中可用,请在应用程序引导期间扩展PLATFORM_PIPES。 此处的教程:https://scotch.io/tutorials/create-a-globally-available-custom-pipe-in-an

  • 我有一个简单的Jenkins管道,它创建了一个包含3个容器的pod——jnlp、dind和示例测试 如下所示- 还定义了几个阶段- 现在我的根文件夹中有了这个脚本“示例”,我想运行它,但不知怎么的,它找不到。 Dockerfile看起来像这样- pwd返回“/home/jenkins/agent/workspace/test pipeline”,而不是docker容器路径。 结果如下- 你知道怎么

  • 3.3 自定义命令 命令语法 定义命令与定义映射的用法其实很相似: :command {lhs} {rhs} 只不过在使用自定义命令时,{lhs} 是直接输入到命令行中的,当你按下回车时,vim 就将 {lhs} 替换为 {rhs} 再执行。所以这在形式上与下面这个映射等效: : nnoremap :{lhs}<CR> :{rhs}<CR> 当然,由于 :command 所支持的参数与 :ma