在 Azure Pipeline 作业中装载 docker 运行

Mounting docker run in Azure Pipeline job

我正在尝试将存储库的根目录挂载到 Azure Pipeline 作业中的 docker 容器。在我的 Windows 本地我可以将源设置为 $(pwd) 成功,但是在我的 Ubuntu 托管代理上我在使用 $(Build.SourcesDirectory) 时收到以下错误:

docker: Error response from daemon: invalid mount config for type "bind": bind mount source path does not exist: /var/vsts/28/s.

路径/var/vsts/28/s是正确的,问题是什么?

Yaml 定义:

jobs:
- job: Run
  pool:
    name: 'Docker'
  steps:
  - task: Docker@2
    displayName: Login to ACR
    inputs:
      command: login
      containerRegistry: acrServiceConnection
  - task: PowerShell@2
    inputs:
      displayName: Run pulumi go
      targetType: inline
      script: |
        docker run --rm --mount type=bind,source=$(Build.SourcesDirectory),target=/project myimage:latest

编辑:

当使用 MS 托管代理时,上面的工作正常。这让我相信这是结帐地点的权限问题。对此有何建议?

当 运行 ls -l:

时,我在自托管和 MS 代理上得到了相同的结果
drwxr-xr-x 8 root root 4096 Sep  9 16:09 folder
-rw-r--r-- 1 root root 1347 Sep  9 16:09 file
-rw-r--r-- 1 root root  178 Sep  9 16:09 ..
-rw-r--r-- 1 root root 5457 Sep  9 16:09 ..

如评论中所述,这可能是权限问题。在您的编辑中,您向我们展示了文件的所有者是 root。在 windows 中,这并不重要,因为 NTFS 不支持它们在 Linux/ext4 上的工作方式相同的权限,它 cannot store the permissions,所以在 windows 上它们很可能只是忽略。

按照建议,尝试在 docker run 前加上这样的 chown:

sudo chown -R $USER $(Build.SourcesDirectory) && docker run ....

或者确保您的代码已签入 VC 并设置了正确的权限。

没有具体提到如何设置自托管代理,可以将 运行 和 Ubuntu 代理都直接安装到 VM, but also as a Docker container

如果代理 运行 宁作为 Docker 容器错误可能来自内部容器启动时 它引用仅存在于外部的路径容器,但不在主机上。

当您 运行 管道中的 Docker 容器并且该管道在代理中执行时也启动了 docker 容器时,会发生以下情况

|=============================================|
|                    HOST                     |
|   |------------------------------------|    |
|   |       Outer container (Agent)      |    |  
|   |                                    |    |
|   |------------------------------------|    |
|                                             |
|   |------------------------------------|    |
|   |       Inner container (Agent)      |    |  
|   |       (Started from pipeline)      |    |
|   |------------------------------------|    |
|                                             |
|=============================================|

当一个 Docker 容器 运行 在另一个 Docker 容器中时,它们都使用主机的 docker 守护进程,因此所有挂载路径都引用主机,无论是否从主机或外部容器启动了一个新容器

示例1:从宿主机挂载一条路径到外层容器

docker run ... -v <path-on-host>:<path-on-outer-container> ...

示例2:从主机挂载路径到内部容器

docker run ... -v <path-on-host>:<path-on-inner-container> ...

示例2:从外容器挂载路径到内容器 如果没有解决方法,就不可能从外部容器安装路径到内部容器,因为主机上的守护程序上的两个容器 运行。

可以确保主机上有一个“共享”space 挂载到外部容器和内部容器中。 (注意始终指定在主机上有效的路径,即使内部容器是从外部容器启动的)

另一个选项是 Microsoft 文档中关于 Docker 代理的 Mounting volumes using Docker within a Docker container 部分中描述的选项:

外层容器启动时声明一个ENV变量:

docker run ... --env DIND_USER_HOME=$HOME ...

在此之后,我们可以从外部容器启动内部容器:

docker run ... -v $DIND_USER_HOME:<path-on-inner-container> ...