【问题标题】:Codebuild not installing PHP packagesCodebuild 没有安装 PHP 包
【发布时间】:2019-09-22 06:35:44
【问题描述】:

我的代码构建一直运行良好,直到今天。它失败并出现以下错误:

Reading state information... 
E: Unable to locate package php7.1 
E: Couldn't find any package by regex 'php7.1' 
E: Unable to locate package php7.1-xml 
E: Couldn't find any package by regex 'php7.1-xml' 
E: Unable to locate package php7.1-xmlrpc 
E: Couldn't find any package by regex 'php7.1-xmlrpc' 
E: Unable to locate package php7.1-zip 
E: Couldn't find any package by regex 'php7.1-zip' 
E: Unable to locate package php7.1-mysql 
E: Couldn't find any package by regex 'php7.1-mysql' 
E: Unable to locate package php7.1-mbstring 
E: Couldn't find any package by regex 'php7.1-mbstring' 
E: Unable to locate package php7.1-mcrypt 
E: Couldn't find any package by regex 'php7.1-mcrypt' 
E: Unable to locate package php7.1-gd 

可能是什么问题? 请注意,构建在此设置下运行良好。 buildspec 文件没有变化。

这是我尝试过的:

version: 0.2
phases:
 install:
   commands:
     - |

         apt-get install -y software-properties-common

         export DEBIAN_FRONTEND=noninteractive
         apt-get update

         LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php

version: 0.2
phases:
 install:
   commands:
     - |

         apt-get install -y software-properties-common

         export DEBIAN_FRONTEND=noninteractive
         apt-get update

         LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
         apt-get update
         apt-get install -y php7.1 \
                  php7.1-xml \
                  php7.1-xmlrpc \
                  php7.1-zip \
                  php7.1-mysql \
                  php7.1-mbstring \
                  php7.1-mcrypt \
                  php7.1-gd \
                  php7.1-opcache \
                  php7.1-dom \
                  php7.1-bcmath \
                  php7.1-curl \
                  unzip \
                  nasm

我希望 php 包能够正常安装。

【问题讨论】:

    标签: amazon-web-services aws-codebuild


    【解决方案1】:

    这是我在 Ubuntu 14.04 上使用的基本映像的问题。 Ubuntu 14.04 LTS 于 2019 年 4 月终止支持,并且从 ondrej 存储库中没有与 ubuntu 14.04 匹配的 repo 文件夹。

    我不得不将我的基础映像切换到 aws/codebuild/standard:2.0,这解决了我的问题。

    【讨论】:

    • 我在 aws/codebuild/standard:2.0 上得到了这个。但我已经转移到 aws/codebuild/standard:4.0 (已经有一段时间了)并删除了@sixfive 提到的黑客,现在它正在工作。
    【解决方案2】:

    当您切换到 aws/codebuild/standard:2.0 时,它会为您提供 Ubuntu 18。您还必须提供类似

    的运行时
    phases:
      install:
        runtime-versions:
          php: 7.3
    

    我发现 AWS 将他们的 PHP ini 放在 /usr/local/etc/php/conf.d/ 中,但是当您安装扩展时,ini 会被放入 /etc/php/7.3/cli/php.ini - 所以你必须将非标准加入标准,以便找到扩展文件。

    这可以通过将标准路径添加到ini文件中来解决:

    touch /usr/local/etc/php/conf.d/extra_config.ini
    echo extension_dir="/usr/lib/php/20180731/" >> /usr/local/etc/php/conf.d/extra_config.ini
    echo extension=gd.so >> /usr/local/etc/php/conf.d/extra_config.ini
    Running command php -m
    

    最终的 buildspec.yml 看起来像这样(有一些调试,所以你可以看到之前和之后,以及 extra_config.ini 的内容:

    phases:
      install:
        runtime-versions:
          php: 7.3
        commands:
          - php -v
          - php -m
          - lsb_release -a
          - LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
          - apt-get update -y
          - apt-get install -y php7.3-gd  php7.3-xdebug
          - ls /usr/lib/php/20180731
          - touch /usr/local/etc/php/conf.d/extra_config.ini
          - "echo extension_dir=\"/usr/lib/php/20180731/\" >> /usr/local/etc/php/conf.d/extra_config.ini"
          - "echo extension=gd.so >> /usr/local/etc/php/conf.d/extra_config.ini"
          - "echo zend_extension=xdebug.so >> /usr/local/etc/php/conf.d/extra_config.ini"  
          - cat /usr/local/etc/php/conf.d/extra_config.ini
          - php -m
    

    【讨论】:

    • 这是一个奇怪的情况@AlexBarker - AWS 说“构建是开源的,所以你可以在那里看到它是如何工作的”。一旦我们获得 Ubuntu 19,他们就会去更改目录,给我们所有人带来极大的不便。
    • 我已经在这里尝试过您的解决方案,但是这个 /usr/lib/php lib 文件夹不存在... find / -name simplexml.so -print 什么也不返回。看起来获得可用的 PHP 安装的唯一方法是使用 NodeJS 运行时,即使您不需要它,并通过包管理器或滚动您自己的容器手动安装 PHP。
    • 收到错误Running command touch /usr/local/bin/php/conf.d/extra_config.ini touch: cannot touch '/usr/local/bin/php/conf.d/extra_config.ini': No such file or directory
    • @AnkitSharma 我也遇到了同样的错误。在过去的 6 个月里,我的 buildspec 文件一直在处理这个问题。
    • @Majid 我能够通过 Code Build -> APP -> Edit Environment -> Override Image 并选择“aws/codebuild/standard:2.0-1.12.0”而不是“Always”使其运行使用此运行时版本的最新映像”。因此它与新的新图像版本中断,但适用于旧版本。
    【解决方案3】:

    我将更新这个问题,因为这里接受的答案似乎对我不起作用,即使它起作用,它也是一个非常脆弱的解决方案。 AWS 为 Ubuntu 18.04 (v2) 证明的 PHP 安装似乎是从源代码编译的,以及所有其他受支持的“运行时版本”,然后转储到 /usr/local。如果您查看此文件夹,您会立即注意到您获得了所有运行时版本,无论您在构建规范文件中指定了哪个版本。这就引出了一个问题,为什么运行时版本需要甚至包含在构建规范文件中?我会假设 AWS 这样做是为了假装他们拥有比他们真正拥有的更多功能和更复杂的系统。

    那么,如何获得 PHP 的工作版本?以下是我正在使用的 buildspec.yml 文件的一部分。你可以选择任何你想要的运行时版本,我们已经确定这个参数不会做任何事情。然后,您需要删除 /usr/local/bin 中包含的所有 PHP 垃圾 AWS,因为该位置位于环境 PATH 中的 /usr/bin 之前。我认为这是由亚马逊完成的,以使这个过程尽可能困难。现在您的路径中不再包含 PHP,您可以通过 apt-get install -y php7.2-cli php7.2-zip 安装 PHP 的包管理器版本。最后,不要忘记为已安装的模块运行phpenmod 以确保它们已启用。

    version: 0.2
    
    run-as: root
    
    phases:
      install:
        runtime-versions:
          nodejs: 8
        commands:
          - rm -f /usr/local/bin/php*
          - rm -f /usr/local/bin/phar*
          - rm -f /usr/local/bin/pear*
          - rm -f /usr/local/bin/pecl*
          - apt-get update
          - apt-get upgrade -y
          - apt-get install -y php7.2-cli php7.2-zip
          - phpenmod zip
    

    【讨论】:

    • 很糟糕,这是让它工作的唯一方法,但没有其他方法对我有用,所以我想我会用这个..
    • 我最终直接使用了 ubuntu:bionic 容器并将其连接到 AWS,这比试图让他们的机器映像做任何有用的事情更简单。