【问题标题】:Docker error: 'useradd: cannot lock /etc/passwd'Docker 错误:'useradd:无法锁定 /etc/passwd'
【发布时间】:2019-06-26 00:58:24
【问题描述】:

我在 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

这是我的 azure-pipelines.yml

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

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

【问题讨论】:

    标签: docker azure-devops azure-pipelines


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

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

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

      您需要成为root 才能修改/etc/passwd。您可以使用-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
      $
      

      在这种特定情况下,cirrus 用户似乎能够运行sudo,因此您也可以像这样完成同样的事情:

      $ docker exec flutter sudo useradd testuser
      $
      

      【讨论】:

      • 对不起这个无辜的问题,但我仍然是 CI 的初学者:我在问题中提出的日志中的命令是由 Azure 直接执行的,而不是通过我的 yaml 脚本。我该如何应用您的建议?
      • 对不起,我对 Azure 一点也不熟悉。我想在熟悉 Azure 管道的人出现并解决这个问题之前,请考虑这一半的答案。
      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 2018-05-28
      • 2022-10-16
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多