Ошибка Docker: «useradd: невозможно заблокировать /etc/passwd»

Я создал конвейер в 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

Как я могу это решить? Я благодарю всех.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
8
0
4 091
2

Ответы 2

Вы не можете заблокировать файл passwd, потому что вы не выполняете команду useradd от имени пользователя root. Образ cirrusci/flutter запускается от имени пользователя cirrus по умолчанию:

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

Вы должны быть root, чтобы модифицировать /etc/passwd. Вы можете запустить команду от имени пользователя root внутри существующего контейнера, используя параметр -u для docker exec. Сравните это:

$ 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. Как я могу применить ваше предложение?

Luciano 01.02.2019 16:12

Извините, я совсем не знаком с Azure. Я полагаю, что это половина ответа, пока кто-нибудь, знакомый с конвейерами Azure, не придет и не ответит на эту сторону вопроса.

larsks 01.02.2019 21:41

Переместите 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

Другие вопросы по теме