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

Luc*_*ano 8 docker azure-devops azure-pipelines

我在 Azure DevOps 中创建了一个管道来运行 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
Run Code Online (Sandbox Code Playgroud)

这是我的 azure-pipelines.yml

jobs:
- job: Build
  pool:
    vmImage: 'ubuntu-16.04'
  container: cirrusci/flutter:latest
  steps:
  - bash: flutter doctor
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我感谢大家。

big*_*gie 8

将 移动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
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 4

您无法锁定该passwd文件,因为您没有useradd以 root 身份运行该命令。镜像默认cirrusci/flutter以用户身份运行cirrus

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

您需要进行root修改/etc/passwd-u您可以使用选项以 root 身份在现有容器内运行命令docker exec。比较一下:

$ docker exec flutter useradd testuser
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
$
Run Code Online (Sandbox Code Playgroud)

对此:

$ docker exec -u root flutter useradd testuser
$
Run Code Online (Sandbox Code Playgroud)

在这种特定情况下,用户看起来好像cirrus能够运行sudo,因此您也可以完成同样的事情,如下所示:

$ docker exec flutter sudo useradd testuser
$
Run Code Online (Sandbox Code Playgroud)