为啥我不能从打包程序构建中运行“源”命令?

Posted

技术标签:

【中文标题】为啥我不能从打包程序构建中运行“源”命令?【英文标题】:Why can't I run "source" command from within a packer build?为什么我不能从打包程序构建中运行“源”命令? 【发布时间】:2015-09-12 12:36:36 【问题描述】:

我正在尝试构建打包程序。

我的源 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

【问题讨论】:

【参考方案1】:

请注意故障排除部分here 中有关 shell 脚本的评论。默认情况下,packer 使用 /bin/sh,它在 Ubuntu 上是 dash shell。 dash shell 不支持“source”命令。相反,您可以:

使用“.”而不是来源 在您的打包程序文件中指定 inline_shebang 使用“脚本”而不是“内联”

【讨论】:

非常有帮助:)。他们声明:If your script has bash-specific commands in it, then put #!/bin/bash -e at the top of your script.【参考方案2】:

你只能在你没有的 shell 中获取资源。无论如何,还有一个更简单的解决方案,直接使用 virtualenv 中为您提供的二进制文件。

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

说明了这个概念,并且与 pip 的工作方式相同。

【讨论】:

谢谢。我应该运行什么命令才能使用 pip 而不是您显示的原始 python 代码? 点子?它在同一个位置。并显示在您自己的输出中。【参考方案3】:

打包器构建 HCL 文件:

build 
  provisioner "shell" 
    script = "../scripts/setup.sh"
  

并在 setup.sh 中将 source 替换为 .

#!/bin/bash

. env/bin/activate

【讨论】:

以上是关于为啥我不能从打包程序构建中运行“源”命令?的主要内容,如果未能解决你的问题,请参考以下文章

怎么打包jar文件啊,为啥我打包的jar不能运行啊

我可以从 JDBC 连接运行“源”命令(SQL 脚本)吗?

为啥我不能在使用 rebar3 生成的应用程序中运行 rebar3 命令?

为啥我不能使用 Ubuntu 编译我的 Java 应用程序?

为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?

为啥 Flutter 应用程序不能使用命令 flutter run -d chrome 在 chrome 上运行