3

我正在使用容器步骤在 Azure Devops yaml-pipeline 中运行 docker 映像。但是,我在安装 repo 的内容时遇到问题,以便可以从 docker 映像内部访问它。

Azure Devops pipeline.yml 文件如下:

container:
  image: 'image-name'
  endpoint: 'foo'
  options: '-v $(Build.SourcesDirectory):/testing'

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script inside docker image'

这失败并显示错误消息:

Error response from daemon: create $(Build.SourcesDirectory): "$(Build.SourcesDirectory)" includes 
invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended 
to pass a host directory, use absolute path

我还尝试替换$(..)$$[..](请参见此处,但这会导致相同的错误。${{..}}管道甚至无法启动(错误:UI 中的“此上下文中不允许模板表达式”)

如果我删除options脚本运行,但未安装 repo。

对于非 yaml 管道,问题已在此处解决。

任何想法如何做到这一点?或者我是否需要创建一个新的 docker 镜像,其中添加了 repo 文件:ed?

4

1 回答 1

2

任何想法如何做到这一点?或者我是否需要创建一个新的 docker 镜像,其中添加了 repo 文件:ed?

当直接指定使用 Yaml Schema 时,Azure DevOps 服务将在任务和您的实际任务之前自动Container调用一个额外的任务。Initialize containerscheckout source repo

container:
  image: 'image-name'

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script inside docker image'

在此处输入图像描述

Initialize containers任务期间,预定义的变量Agent.BuildDirectory,Build.Repository.LocalPathBuild.SourcesDirectory不展开(未定义的变量)。

所以你不能Build.SourcesDirectory以这种方式使用,因为这个变量的值在任务之后被扩展。Initialize containers

1.关于你上面分享的链接为什么可以工作:它在一个docker任务/步骤中,所以它可以识别$(Build.SourcesDirectory)变量。(真正的构建任务在构建变量被定义后运行)

2.如果您使用特定的 Micorosft 托管代理,您可以尝试对路径进行硬编码。你可以检查这个类似的问题

通常用于 Windows 托管代理:$(Build.SourcesDirectory)=>D:\a\1\s

对于 Ubuntu 托管的代理:$(Build.SourcesDirectory)=> /home/vsts/work/1/s

于 2020-05-27T10:08:32.397 回答