Docker错误:'useradd:无法锁定/ etc / passwd'

10

我在Azure DevOps中创建了一个pipeline,用于运行Docker cirrus/flutter镜像。当Azure尝试初始化容器(在useradd命令中)时,会出现错误。下面是执行日志的最后一部分,包括错误信息:

##[command]/usr/bin/docker exec  5ae52fcbeefecc0df48056df5f9d673429fe5173e7a8e3d984d889ce5223c34c sh -c "command -v bash"
/bin/bash
##[command]whoami 
vsts
##[command]id -u vsts
1001
Try create an user with UID '1001' inside the container.
##[command]/usr/bin/docker exec  5ae52fcbeefecc0df48056df5f9d673429fe5173e7a8e3d984d889ce5223c34c bash -c "grep 1001 /etc/passwd | cut -f1 -d:"
##[command]/usr/bin/docker exec  5ae52fcbeefecc0df48056df5f9d673429fe5173e7a8e3d984d889ce5223c34c id -u bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
id: extra operand 'warning:'
Try 'id --help' for more information.
##[command]/usr/bin/docker exec  5ae52fcbeefecc0df48056df5f9d673429fe5173e7a8e3d984d889ce5223c34c useradd -m -u 1001 vsts_azpcontainer
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
##[error]Docker exec fail with exit code 1
##[section]Finishing: Initialize containers

这是我的 azure-pipelines.yml 文件

jobs:
- job: Build
  pool:
    vmImage: 'ubuntu-16.04'
  container: cirrusci/flutter:latest
  steps:
  - bash: flutter doctor

我该怎么解决这个问题?谢谢大家。

2个回答

10
container移动到resource部分,并将docker选项--user 0:0作为options传递。

例如:

resources:
  containers:
  - container: flutter
    image: cirrusci/flutter:latest
    options: --user 0:0

jobs:
- job: Build
  pool:
    vmImage: 'ubuntu-16.04'
  container: flutter
  steps:
  - bash: flutter doctor

4

由于您没有以root身份运行useradd命令,因此无法锁定passwd文件。默认情况下,cirrusci / flutter映像作为cirrus用户运行:

$ docker run -it  cirrusci/flutter id
uid=1000(cirrus) gid=999(cirrus) groups=999(cirrus),27(sudo)

要修改/etc/passwd,您需要成为root。您可以使用-u选项来运行docker exec中的root命令。对比一下:

$ docker exec flutter useradd testuser
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
$

翻译为:

$ docker exec -u root flutter useradd testuser
$

在这个特定的情况下,看起来用户可以运行,所以你也可以像这样完成同样的事情:
$ docker exec flutter sudo useradd testuser
$

抱歉问一个幼稚的问题,但我在CI方面还是个新手:我在问题中展示的日志命令是由Azure直接执行的,而不是通过我的yaml脚本执行的。我该如何应用你的建议? - Luciano
很抱歉,我对Azure一点也不熟悉。我想你可以将这看作是一半的答案,直到有熟悉Azure管道的人来回答这个问题的那一面。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接