Packer не может выполнить сборку Docker с ошибкой «sudo: not found», несмотря на присутствие sudo - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать образ упаковщика с докером и хочу, чтобы докер создал образ докера с помощью специального скрипта. Соответствующая часть моего кода (обратите внимание, что главный компоновщик дважды проверяет, установлен ли sudo):

{
  "type": "shell",
  "inline": [
    "apt-get install sudo"
  ]
},
{
  "type": "docker",
  "image": "python:3",
  "commit": true,
  "changes": [
    "RUN pip install Flask",
    "CMD [\"python\", \"echo.py\"]"
  ]
}

Соответствующая часть моего вывода на экран:

==> docker: provisioning with shell script: /var/folders/s8/g1_gobbldygook/T/packer-shell23453453245
    docker: /temp/script_1234.sh: 3: /tmp/script_1234.sh: sudo: not found
==> docker: killing the contaner: 34234hashvomit234234
Build 'docker' errored: Scipt exited with non-zero exit status: 127

Рассматриваемый сценарий не один из моих. Это какой-то случайно сгенерированный скрипт, который каждый раз строит разные серии из четырех чисел. Я новичок и в упаковщике, и в докере, так что, может быть, очевидно, в чем проблема, но это не для меня.

1 Ответ

1 голос
/ 12 апреля 2019

Кажется, есть несколько проблем с вашим вводом упаковщика. Поскольку вы не включили полный входной файл, трудно сказать, но обратите внимание на пару вещей:

  1. Возможно, вам нужно запустить apt-get update перед вызовом apt-get install sudo. Без этого, даже если изображение содержит кэшированные метаданные пакета, оно, вероятно, устарело. Если я попытаюсь создать изображение, используя ваш ввод, он потерпит неудачу с:

    E: Unable to locate package sudo
    
  2. Хотя это не проблема в этом контексте, хорошо бы явно включить -y в командную строку apt-get, когда вы запускаете ее неинтерактивно:

    apt-get -y install sudo

    В ситуациях, когда apt-get подключен к терминалу, это не позволит ему запрашивать подтверждение. Это не необходимое изменение вашего ввода, но я думаю, что это хорошо, чтобы быть явным.

  3. Исходя из документов и моего тестирования, вы не можете включить оператор RUN в блок changes конструктора докеров. Это не с:

    Stderr: Error response from daemon: run is not a valid change command
    

    К счастью, мы можем переместить эту команду pip install в поставщика shell.

С этими изменениями следующий вход успешно создает образ:

{
    "builders": [{
        "type": "docker",
        "image": "python:3",
        "commit": true
    }],

    "provisioners": [{
        "type": "shell",
        "inline": [
          "apt-get update",
          "apt-get -y install sudo",
          "pip install Flask"
        ]
    }],

    "post-processors": [[ {
        "type": "docker-tag",
        "repository": "packer-test",
        "tag": "latest"
    } ]]
}

( NB : протестировано с использованием Packer v1.3.5)

...