Почему я не могу запустить исходную команду из сборки упаковщика?

Я пытаюсь сделать сборку упаковщика.

Мой исходный AMI — это коробка Ubuntu. Я хотел бы установить и запустить виртуальную среду Python.

Мой провайдер показан ниже. apt-get отлично работает и создает файл virtualenv. Однако, когда я делаю источник при активации, он терпит неудачу. Я получаю следующую ошибку: /tmp/script.sh: 53: /tmp/script.sh

Кажется, я не могу запустить source в своей сборке упаковщика. Как обойти эту проблему? Мне нужно запустить virtualenv и сделать pip install внутри него.

  "provisioners": [

    {
      "type": "shell",
      "inline": [
        "echo '70'",
        "sudo apt-get --assume-yes install python-virtualenv",
        "echo '80'",
        "sudo virtualenv /home/myuser/myVirtualEnv",
        "echo '90'",
        "ls -altr /home/myuser/myVirtualEnv/bin",
        "echo '95'",
        "source /home/myuser/myVirtualEnv/bin/activate",
        "echo '100'",
      ]
    }
  ]

Вот вывод консоли:

  myHostName: 70
  myHostName: Reading package lists... Done
  myHostName: Building dependency tree
  myHostName: Reading state information... Done
  myHostName: The following NEW packages will be installed:
  myHostName: python-virtualenv
  myHostName: 0 upgraded, 1 newly installed, 0 to remove and 125 not upgraded.
  myHostName: Need to get 1,485 kB of archives.
  myHostName: After this operation, 1,935 kB of additional disk space will be used.
  myHostName: Get:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ trusty/universe python-virtualenv all 1.11.4-1 [1,485 kB]
  myHostName: Fetched 1,485 kB in 0s (22.5 MB/s)
  myHostName: Selecting previously unselected package python-virtualenv.
  myHostName: (Reading database ... 56592 files and directories currently installed.)
  myHostName: Preparing to unpack .../python-virtualenv_1.11.4-1_all.deb ...
  myHostName: Unpacking python-virtualenv (1.11.4-1) ...
  myHostName: Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
  myHostName: Setting up python-virtualenv (1.11.4-1) ...
  myHostName: 80
  myHostName: New python executable in /home/myuser/myVirtualEnv/bin/python
  myHostName: Installing setuptools, pip...done.
  myHostName: 90
  myHostName: total 3312
  myHostName: lrwxrwxrwx 1 root root       6 Jun 25 17:21 python2.7 -> python
  myHostName: lrwxrwxrwx 1 root root       6 Jun 25 17:21 python2 -> python
  myHostName: -rwxr-xr-x 1 root root 3345416 Jun 25 17:21 python
  myHostName: -rwxr-xr-x 1 root root     254 Jun 25 17:21 easy_install-2.7
  myHostName: -rwxr-xr-x 1 root root     254 Jun 25 17:21 easy_install
  myHostName: -rwxr-xr-x 1 root root     226 Jun 25 17:21 pip2.7
  myHostName: -rwxr-xr-x 1 root root     226 Jun 25 17:21 pip2
  myHostName: -rwxr-xr-x 1 root root     226 Jun 25 17:21 pip
  myHostName: drwxr-xr-x 6 root root    4096 Jun 25 17:21 ..
  myHostName: -rw-r--r-- 1 root root    1129 Jun 25 17:21 activate_this.py
  myHostName: -rw-r--r-- 1 root root    2476 Jun 25 17:21 activate.fish
  myHostName: -rw-r--r-- 1 root root    1263 Jun 25 17:21 activate.csh
  myHostName: -rw-r--r-- 1 root root    2207 Jun 25 17:21 activate
  myHostName: drwxr-xr-x 2 root root    4096 Jun 25 17:21 .
  myHostName: 95
  myHostName: /tmp/script.sh: 53: /tmp/script.sh: source: not found
  myHostName: 100

person Saqib Ali    schedule 25.06.2015    source источник


Ответы (2)


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

$ virtualenv foobarbaz
$ foobarbaz/bin/python -c 'import sys; print sys.prefix;'

иллюстрирует концепцию и будет работать таким же образом с pip.

person deets    schedule 25.06.2015
comment
Спасибо. Какую команду я должен запустить, чтобы это работало с pip вместо необработанного кода python, который вы показали? - person Saqib Ali; 25.06.2015
comment
Пип? Это в том же месте. И показано в вашем собственном выводе. - person deets; 25.06.2015

Обратите внимание на комментарий о сценариях оболочки в разделе «Устранение неполадок» здесь. По умолчанию упаковщик использует /bin/sh, который в Ubuntu является оболочкой dash. Оболочка dash не поддерживает команду "source". Вместо этого вы могли бы:

  • Использовать "." вместо источника
  • Укажите inline_shebang в вашем файле упаковщика
  • Используйте «скрипт» вместо «встроенного»
person mark    schedule 25.06.2015
comment
Очень полезно :). Они заявляют: If your script has bash-specific commands in it, then put #!/bin/bash -e at the top of your script. - person another; 26.04.2018