在 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> ...
我正在尝试将存储库的根目录挂载到 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
:
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> ...