Я использую упаковщик для создания изображения для доставки, и у меня странная проблема.
Я добавляю пользователей в группу Docker со следующими строками
"sudo groupadd docker",
"sudo usermod -aG docker {{user `service_user`}}",
"sudo usermod -aG docker {{user `config_user`}}",
"newgrp docker",
Во время выполнения шаблона упаковщика все работает нормально; команда выводит ожидаемые значения, и изображение создается.
Packer оставляет выключенный vm на esx (я использую vsphere).
Я запускаю его, и если я вхожу в систему как пользователь службы, я получаю следующие результаты:
seven10@seven10-sfm:~$ groups
seven10 adm cdrom sudo dip plugdev lxd lpadmin sambashare
seven10@seven10-sfm:~$
но группы докеров нигде не найти! Но группа существует:
seven10@seven10-sfm:~$ cat /etc/group|grep docker
docker:x:999:
Если я перезапущу команды usermod, я правильно добавлюсь в группы, и правильное членство будет сохраняться после перезагрузки.
Однако весь смысл в автоматизации этого состоит в том, чтобы избежать необходимости входить в систему и вводить команды usermod.
Кто-нибудь знает, что с этим происходит и как я могу это исправить?
РЕДАКТИРОВАТЬ: Добавлена версия шаблона, которая дает те же результаты
{
"variables": {
"has_automator": "",
"has_hydrator": "",
"has_mongo": "",
"has_rabbit": "",
"service_user": "seven10",
"service_user_pass": "****",
"config_user": "config",
"config_user_pass": "****",
"rabbit_version": "3.6.0-management",
"mongo_version" : "3.4.4",
"docker_user": "****",
"docker_pass": "",
"docker_network_name": "****",
"esx_host": "****",
"vcenter_server": "****",
"vcenter_datacenter": "*****",
"vcenter_datastore": "*****",
"vcenter_username": "*****",
"vcenter_password": "",
"hydra_version": "",
"hydra_name": "",
"vm_disk_size": "100",
"vm_cpu": "4",
"vm_ram": "8000",
"vm_template": "Ubuntu-16.04"
},
"builders": [
{
"type": "vsphere",
"vcenter_server": "{{user `vcenter_server`}}",
"host": "{{user `esx_host`}}",
"datacenter": "{{user `vcenter_datacenter`}}",
"datastore": "{{user `vcenter_datastore`}}",
"username": "{{user `vcenter_username`}}",
"password": "{{user `vcenter_password`}}",
"template": "{{user `vm_template`}}",
"vm_name": "{{user `hydra_name`}}-{{user `hydra_version`}}",
"disk_size": "{{user `vm_disk_size`}}",
"CPUs": "{{user `vm_cpu`}}",
"RAM": "{{user `vm_ram`}}",
"insecure_connection": true,
"ssh_username": "{{user `service_user`}}",
"ssh_password": "{{user `service_user_pass`}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sleep 10"
]
},
{
"type": "shell",
"execute_command": "echo '{{user `service_user_pass`}}' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"inline": [
"echo 'creating config user account'",
"useradd {{user `config_user`}} -s /bin/bash -m",
"echo {{user `config_user`}}:{{user `config_user_pass`}} | chpasswd"
]
},
{
"type": "shell",
"execute_command": "echo '{{user `service_user_pass`}}' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
"inline": [
"echo 'Adding Docker repo to Apt'",
"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -",
"sudo apt-key fingerprint 0EBFCD88 | grep docker@docker.com || exit 1",
"sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"",
"echo Updating apt index",
"sudo apt-get update",
"echo 'remove any old vmware tools'",
"sudo apt-get remove -y --purge open-vm-tools",
"echo 'installing required packages'",
"sudo apt-get install -y openssh-server vim curl ufw nfs-common unzip linux-image-extra-$(uname -r) apt-transport-https ca-certificates software-properties-common open-vm-tools-desktop docker-ce openjdk-8-jre-headless",
"echo 'Installing docker",
"sudo groupadd docker",
"sudo usermod -aG docker {{user `service_user`}}",
"sudo usermod -aG docker {{user `config_user`}}",
"newgrp docker",
"echo 'Install docker-compose",
"sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose",
"sudo curl -L https://raw.githubusercontent.com/docker/compose/1.18.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose",
"sudo chmod +x /usr/local/bin/docker-compose",
"docker-compose --version",
"echo 'Log in to dockerhub'",
"echo {{user `docker_pass`}} | docker login -u {{user `docker_user`}} --password-stdin",
"echo 'creating docker network'",
"docker network create -d bridge {{user `docker_network_name`}}",
"chown -R {{user `service_user`}}:{{user `service_user`}} /home/{{user `service_user`}}/.docker"
]
}
]
}
Шаблон vm - это просто машина, которую я запустил с ISO 16.04, установил базу с именем пользователя, совпадающим с именем service_user, а затем экспортировал как шаблон в vsphere. В конце концов я собираюсь переместить ISO вместо шаблона, но это выходит за рамки этого вопроса.
РЕДАКТИРОВАТЬ 2:
Я попытался добавить вывод команды groups
после команды newgrp docker
с помощью любого из следующих
"groups"
"echo $(groups)"
"echo \"$(groups)\"
и все, что я получаю от этого, - это фактическая команда (то есть: vsphere: echo "$(groups)"
). Таким образом, кажется, что причина, по которой пользователь не добавлен в группу, может быть в том, что он просто повторяет команды.
Вот что выводит соответствующий раздел шаблона при запуске:
==> vsphere: Provisioning with shell script: /tmp/packer-shell518775104
vsphere: Installing docker
vsphere: sudo groupadd docker
vsphere: sudo usermod -aG docker seven10
vsphere: sudo usermod -aG docker config
vsphere: newgrp docker
vsphere: echo displaying groups
vsphere: echo "$(groups)"