Azure devops 在azure管道中的docker任务中使用build和push命令时,是否必须注销

Azure devops 在azure管道中的docker任务中使用build和push命令时,是否必须注销,azure-devops,yaml,azure-pipelines,Azure Devops,Yaml,Azure Pipelines,一个名为buildAndPush的方便命令允许在单个命令中构建图像并将其推送到容器注册表。请参阅上面的代码片段 问题: 我是否需要通过添加以下任务从容器注册表注销 steps: - task: Docker@2 displayName: Build and Push inputs: command: buildAndPush containerRegistry: dockerRegistryServiceConnection1 repository: contos

一个名为buildAndPush的方便命令允许在单个命令中构建图像并将其推送到容器注册表。请参阅上面的代码片段

问题:

我是否需要通过添加以下任务从容器注册表注销

steps:
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    containerRegistry: dockerRegistryServiceConnection1
    repository: contosoRepository
    tags: |
      tag1

在我看来,这是没有必要的登录或注销

您甚至可以在中找到未登录或注销的示例:

-阶段:构建
displayName:构建和推送阶段
工作:
-工作:建造
显示名称:生成作业
游泳池:
vmImage:$(vmImageName)
步骤:
-任务:Docker@2
displayName:生成图像并将其推送到容器注册表
投入:
命令:buildAndPush
存储库:$(imageRepository)
dockerfile:$(dockerfilePath)
containerRegistry:$(dockerRegistryServiceConnection)
标签:|
$(标签)
所以你可能想知道登录到底是做什么的。如果检查源代码,您会发现它实际上设置了
DOCKER\u CONFIG
(客户端配置文件的位置)

导出功能运行(连接:ContainerConnection):任意{
var defer=Q.defer();
connection.setDockerConfigEnvVariable();
延迟解析(null);
回报、承诺;
}
以及
注销的功能;)

导出功能运行(连接:ContainerConnection):任意{
//正在connection.close()方法中处理注销,该方法在命令执行后调用。
var defer=Q.defer();
延迟解析(null);
回报、承诺;
}
那么它是如何工作的呢

//连接到任何指定的容器注册表
let连接=新的容器连接();
打开(null,registryAuthenticationToken,true,isLogout);
让dockerCommandMap={
“buildandpush”:“/dockerbuildandpush”,
“构建”:“/dockerbuild”,
“推送”:“/dockerpush”,
“登录”:“/dockerlogin”,
“注销”:“/dockerlogout”
}
让遥测={
命令:命令,,
jobId:tl.getVariable('SYSTEM\u jobId')
};
console.log(“##vso[telemetry.publish area=%s;feature=%s]%s”,
“TaskEndpointId”,
“DockerV2”,
stringify(遥测));
/*tslint:disable:不需要变量*/
let commandImplementation=require(“./dockercommand”);
if(dockerCommandMap中的命令){
commandImplementation=require(dockerCommandMap[command]);
}
让ResultPath=“”;
commandImplementation.run(连接,(路径结果)=>{
结果路径+=路径结果;
})
/*tslint:enable:不需要变量*/
.fin(函数清理(){
如果(命令!=“登录”){
连接。关闭(真,命令);
}
})
启动
build
命令,您将

  • 连接到容器注册表
  • 运行命令
  • 关闭连接(如果这不是登录命令)
这就是紧密连接的作用:

如果存在注册表信息,则仅删除该注册表的身份验证。(任何命令都可能发生这种情况-生成、推送、注销等) 否则,请删除所有身份验证数据。(这仅在注销命令的情况下发生。对于其他命令,不调用注销。)


回答您的问题,您可以不使用登录和注销命令而生活。

在我看来,这不是登录或注销的必要条件

您甚至可以在中找到未登录或注销的示例:

-阶段:构建
displayName:构建和推送阶段
工作:
-工作:建造
显示名称:生成作业
游泳池:
vmImage:$(vmImageName)
步骤:
-任务:Docker@2
displayName:生成图像并将其推送到容器注册表
投入:
命令:buildAndPush
存储库:$(imageRepository)
dockerfile:$(dockerfilePath)
containerRegistry:$(dockerRegistryServiceConnection)
标签:|
$(标签)
所以你可能想知道登录到底是做什么的。如果检查源代码,您会发现它实际上设置了
DOCKER\u CONFIG
(客户端配置文件的位置)

导出功能运行(连接:ContainerConnection):任意{
var defer=Q.defer();
connection.setDockerConfigEnvVariable();
延迟解析(null);
回报、承诺;
}
以及
注销的功能;)

导出功能运行(连接:ContainerConnection):任意{
//正在connection.close()方法中处理注销,该方法在命令执行后调用。
var defer=Q.defer();
延迟解析(null);
回报、承诺;
}
那么它是如何工作的呢

//连接到任何指定的容器注册表
let连接=新的容器连接();
打开(null,registryAuthenticationToken,true,isLogout);
让dockerCommandMap={
“buildandpush”:“/dockerbuildandpush”,
“构建”:“/dockerbuild”,
“推送”:“/dockerpush”,
“登录”:“/dockerlogin”,
“注销”:“/dockerlogout”
}
让遥测={
命令:命令,,
jobId:tl.getVariable('SYSTEM\u jobId')
};
console.log(“##vso[telemetry.publish area=%s;feature=%s]%s”,
“TaskEndpointId”,
“DockerV2”,
stringify(遥测));
/*tslint:disable:不需要变量*/
let commandImplementation=require(“./dockercommand”);
if(dockerCommandMap中的命令){
commandImplementation=require(dockerCommandMap[command]);
}
让ResultPath=“”;
commandImplementation.run(连接,(路径结果)=>{
结果路径+=路径结果;
})
/*tslint:enable:不需要变量*/
.fin(函数清理(){
如果(命令!=“登录”){
连接。关闭(真,命令);
}
})
启动
build
命令,您将

  • 连接到容器注册表
  • 运行命令
  • 关闭连接(如果这不是登录命令)
这就是紧密连接的作用:

如果存在注册表信息,则仅删除该注册表的身份验证。(任何命令都可能发生这种情况-生成、推送、注销等
- task: Docker@2
  displayName: Logout of ACR
  inputs:
    command: logout
    containerRegistry: dockerRegistryServiceConnection1