PHP 和 Composer 与 Docker 构建:无法克隆 git

DMC*_*ing 3 git git-clone composer-php docker dockerfile

我正在尝试创建一个 Dockerfile 来按照安装指南自动安装 HumHub: https: //www.humhub.org/docs/guide-admin-installation.html

但是,每当构建脚本运行 Composer 时,我都会收到以下错误:

Changed current directory to /root/.composer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing fxp/composer-asset-plugin (v1.1.1)
    Downloading: Connecting...    Failed to download fxp/composer-asset-plugin from dist: Could not authenticate against github.com
    Now trying to download from source
- Installing fxp/composer-asset-plugin (v1.1.1)
    Cloning daca454b94539a4e6d30937dfc6b817eceb03f28

Writing lock file
Generating autoload files
Loading composer repositories with package information
Updating dependencies (including require-dev)
Failed to clone the git@github.com:jquery/jquery-dist.git repository, try running in interactive mode so that you can enter your GitHub credentials

[RuntimeException]                                                          
Failed to execute git clone --mirror 'git@github.com:jquery/jquery-dist.git' '/root/.composer/cache/vcs/git-github.com-jquery-jquery-dist.git/'  
Run Code Online (Sandbox Code Playgroud)

大概这是由于 Composer 使用 git 安装 jquery 并期望 git 预先配置了 git 访问凭据所致。但是,为 Docker 构建脚本提供 git 访问凭据是没有意义的。

我尝试强制 git 和 Composer 使用 https(请参阅如何强制 Composer 使用 https:// 而不是 git://?),但它似乎没有达到预期的效果。这可能是由作曲家插件composer-asset-plugin 中的错误引起的吗?

这是构建文件:

FROM orukami/alpine-php:5.6

ENV WWW_ROOT /var/www
ENV PUBLIC_ROOT /var/www/public

COPY nginx /etc/nginx
COPY fpm /etc/php/fpm
COPY supervisord.conf /etc/supervisord.conf
COPY entrypoint.sh /

RUN apk add -U nginx supervisor git curl && \
    mkdir -p /var/www && mkdir -p ${WWW_ROOT} && \
    rm -rf /var/cache/apk/* && \
    chmod +x /entrypoint.sh

RUN git clone https://github.com/humhub/humhub.git /var/www/public
RUN cd /var/www/public && curl -sS https://getcomposer.org/installer | php
RUN git config --global url."https://".insteadOf "git://" && cd /var/www/public && \
    ./composer.phar config --global github-protocols https && \
    ./composer.phar global require "fxp/composer-asset-plugin:~1.1.0" && \
    ./composer.phar update

WORKDIR ${WWW_ROOT}

EXPOSE 80 443

VOLUME /var/www/public

ENTRYPOINT ["/entrypoint.sh"]

CMD ["/usr/bin/supervisord"]
Run Code Online (Sandbox Code Playgroud)

这肯定是一个很常见的问题,但是我在网上根本找不到任何解决方案。

Nel*_*cia 5

接受的解决方案可以工作,但也可能不安全,因为 config.json 文件中硬编码了 github 令牌。请参阅此处了解详细说明和更安全的解决方案:https://www.previousnext.com.au/blog/managing-composer-github-access-personal-access-tokens

根本原因是github限制了像composer这样的客户端调用api的次数。Composer 使用 github api 将文件下载到您的供应商目录,当达到限制时(https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting),您可以将看到该错误消息。

在某些情况下(比如我的情况,这并不完全是 @DMCoding 的情况),如果您无法生成令牌,例如,存储库不在您的控制之下,另一种选择是减少 api 请求的数量Composer 通过在composer.json 中将参数 no-api 设置为 true 来实现,例如:

"repositories": [
  {
    "type": "vcs",
    "url": "https://github.com/user/repo",
    "no-api": true
  }
]
Run Code Online (Sandbox Code Playgroud)

Composer 会将每个存储库的调用从大约 20 个减少到只有 1 个:从 github 下载压缩存储库的调用。有一种方法可以为来自 github 的所有包设置选项:这样,composer 只会下载一次压缩的存储库,并尝试在每次更新中运行 git pull: https: //getcomposer.org/doc/06-config.md#使用 github-api