Azure pipelines Docker@2构建命令无法传递构建参数

94次阅读
没有评论

问题描述

在使用Azure构建管道时,遇到了一个问题。他在azure-pipelines.yml文件中设置了一个docker化应用程序的构建管道。问题是,他需要将一个构建参数传递给docker build命令,但是无论在什么情况下,该参数都为空(即使没有提供构建参数,并且在Dockerfile中指定了默认值)。
以下是用户提供的部分azure-pipelines.yaml文件:

- task: Docker@2
  displayName: build
  inputs:
    containerRegistry: our_container_registry
    repository: $(Build.Repository.Name)
    command: build
    Dockerfile: '**/Dockerfile'
    tags: $(Build.BuildNumber)
    arguments: --build-arg BuildNumber=$(Build.BuildNumber)

进一步的细节:
– 我们使用ubuntu-latest的VM映像来运行作业。
– 构建参数似乎已经正确传递,因为它在运行的命令的打印输出中出现。
– 我们没有运行buildAndPush命令,我知道该命令在构建参数方面存在问题。
Dockerfile包含命令RUN echo Build Number: ${BuildNumber},在构建过程中打印出Build Number:

用户希望能够解决构建参数无法正确传递给docker build的问题,或者如果有其他未知的问题导致无法传递构建参数,希望能够提供其他解决方案的建议。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

解决方案1

根据用户提供的信息,问题可能是由于ARG命令的作用域错误导致的。用户在Dockerfile中的设置如下:

FROM base_image_name AS build
ARG BuildNumber=0.1.0.0
# ...
FROM build AS publish
# ...
RUN echo Build Number: ${BuildNumber}

解决此问题的方法是将ARG命令的位置调整正确。在Azure上修复此问题的方法如下:

FROM base_image_name AS build
# ...
FROM build AS publish
ARG BuildNumber=0.1.0.0
# ...
RUN echo Build Number: ${BuildNumber}

这样修复后,应该能够在Azure上成功构建。

请注意,为什么这个问题在本地机器上构建成功,但在Azure上失败,目前还不清楚。但是通过修复作用域问题,现在应该能够成功构建。

解决方案2

如果解决方案1无法解决问题,您可以尝试使用其他方法来传递构建参数。以下是一些可能的替代方法:
– 在Dockerfile中使用环境变量:您可以在Dockerfile中使用ENV命令来设置环境变量,然后在构建过程中使用--build-arg参数将值传递给环境变量。例如:

FROM base_image_name AS build
ENV BuildNumber=0.1.0.0
# ...
FROM build AS publish
# ...
RUN echo Build Number: ${BuildNumber}

然后,在azure-pipelines.yml文件中使用arguments属性传递构建参数:

- task: Docker@2
  displayName: build
  inputs:
    containerRegistry: our_container_registry
    repository: $(Build.Repository.Name)
    command: build
    Dockerfile: '**/Dockerfile'
    tags: $(Build.BuildNumber)
    arguments: --build-arg BuildNumber=$(Build.BuildNumber)
  • 使用脚本或其他工具:您可以编写脚本或使用其他工具来控制构建过程,并在构建过程中传递构建参数。这样可以更灵活地控制构建过程,并确保构建参数正确传递。

以上是解决构建参数无法正确传递给docker build的两种可能的解决方案。您可以根据实际情况选择适合您的方法来解决问题。

正文完