简体   繁体   English

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

[英]PHP and Composer with Docker build: failed to clone git

I am trying to create a Dockerfile to automate the installation of HumHub following the install guide: https://www.humhub.org/docs/guide-admin-installation.html我正在尝试创建一个 Dockerfile 以按照安装指南自动安装 HumHub: https ://www.humhub.org/docs/guide-admin-installation.html

However, whenever the build script runs composer, I get the following error:但是,每当构建脚本运行 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/'  

Presumably this is caused by composer using git to install jquery and expecting git to be pre-configured with git access credentials.据推测,这是由作曲家使用 git 安装 jquery 并期望使用 git 访问凭据预先配置 git 引起的。 However, it makes no sense to provide git access credentials for a Docker build script.但是,为 Docker 构建脚本提供 git 访问凭据是没有意义的。

I have attempted to force both git and composer to use https (see How to force Composer to use https:// instead of git://? ) however it does not appear to have the desired effect.我试图强制 git 和 composer 都使用 https(请参阅如何强制 Composer 使用 https:// 而不是 git://? ),但它似乎没有达到预期的效果。 Could this be caused by a bug in the composer plugin composer-asset-plugin?这可能是由作曲家插件 composer-asset-plugin 中的错误引起的吗?

Here's the build file:这是构建文件:

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"]

This must be a very common problem, however I can't find any solutions at all online.这一定是一个非常普遍的问题,但是我在网上根本找不到任何解决方案。

The problem was eventually traced to the composer-asset-plugin not respecting the instruction to load over https instead of git://.问题最终被追溯到 composer-asset-plugin 不遵守通过 https 而不是 git:// 加载的指令。 The solution is to copy over a file like this one: https://github.com/djcf/humhub-docker/blob/master/config.json into /root/.composer.解决方案是将这样的文件复制到 /root/.composer 中: https ://github.com/djcf/humhub-docker/blob/master/config.json。

The accepted solution could work but it could also be insecure because there is a github token hardcoded into the config.json file.已接受的解决方案可能有效,但也可能不安全,因为 config.json 文件中硬编码了一个 github 令牌。 See here for a detailed explanation and more secure solution: https://www.previousnext.com.au/blog/managing-composer-github-access-personal-access-tokens有关详细说明和更安全的解决方案,请参见此处: https : //www.previousnext.com.au/blog/managing-composer-github-access-personal-access-tokens

The root cause is that github limits the number of api calls made by a client like composer.根本原因是github限制了像composer这样的客户端调用api的次数。 Composer uses github api to download the files to your vendor directory and when it reaches de limit ( https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting ) you will see that error message. Composer 使用 github api 将文件下载到您的供应商目录,当它达到 de limit ( https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting ) 时,您将看到该错误消息。

In certain circumstances (like mine which is not exactly the @DMCoding 's situation), if you have no way to generate the token because, for example, the repository is not under your control, another alternative is to reduce the number of api requests composer does by setting the parameter no-api to true in composer.json, for example:在某些情况下(比如我的,这不完全是 @DMCoding 的情况),如果您无法生成令牌,例如因为存储库不在您的控制之下,另一种选择是减少 api 请求的数量composer 通过在 composer.json 中将参数 no-api 设置为 true 来实现,例如:

"repositories": [
  {
    "type": "vcs",
    "url": "https://github.com/user/repo",
    "no-api": true
  }
]

Composer will reduce the calls per repo from around 20 to just one: the call to download the zipped repo from github. Composer 将每个 repo 的调用从大约 20 次减少到只有一个:从 github 下载压缩的 repo 的调用。 There is a way to set the option for all packages from github: that way composer will download the zipped repo only once and try to run git pull in every update: https://getcomposer.org/doc/06-config.md#use-github-api有一种方法可以为 github 中的所有包设置选项:这样作曲家将只下载一次压缩的 repo,并尝试在每次更新时运行 git pull: https : //getcomposer.org/doc/06-config.md#使用-github-api

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM