You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker执行composer install遇Git主机密钥验证失败求助

Docker中执行composer install时Git主机密钥验证失败的解决方法

错误信息

执行composer install时触发以下错误:

In Git.php line 471:
#0 14.00
#0 14.00   Failed to execute git clone --mirror -- 'git@github.com:Laravel-Backpack/PR
#0 14.00   O.git' '/root/.composer/cache/vcs/git-github.com-Laravel-Backpack-PRO.git/'
#0 14.00
#0 14.00   Cloning into bare repository '/root/.composer/cache/vcs/git-github.com-Lara
#0 14.00   vel-Backpack-PRO.git'...
#0 14.00   Host key verification failed.
#0 14.00   fatal: Could not read from remote repository.
#0 14.00
#0 14.00   Please make sure you have the correct access rights
#0 14.00   and the repository exists.

当前Dockerfile内容

FROM php:8.2.8-apache-bullseye

# Use the default production configuration
#RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

# apache configs + document root
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# mod_rewrite for URL rewrite and mod_headers for .htaccess extra headers like Access-Control-Allow-Origin-
RUN a2enmod rewrite && a2enmod ssl && a2enmod socache_shmcb
# RUN sed -i '/SSLCertificateFile.*snakeoil\.pem/c\SSLCertificateFile \/etc\/ssl\/certs\/mycert.crt' /etc/apache2/sites-available/default-ssl.conf && sed -i '/SSLCertificateKeyFile.*snakeoil\.key/cSSLCertificateKeyFile /etc/ssl/private/mycert.key\' /etc/apache2/sites-available/default-ssl.conf
RUN a2ensite default-ssl

# install and update php packages and extensions
RUN apt-get update \
&& apt-get install -y libzip-dev openssl zip unzip git libonig-dev libicu-dev libmemcached-dev \
&& pecl install memcached \
&& docker-php-ext-configure intl \
&& docker-php-ext-install zip intl pdo mbstring mysqli pdo_mysql \
&& docker-php-ext-enable pdo_mysql memcached

# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
    && composer --no-scripts --ansi --version --no-interaction

# copy composer related files first and then run composer install
WORKDIR /var/www/html

COPY ./src/auth.json /root/.composer
COPY ./src/config.json /root/.composer

COPY ./src/composer.json ./src/composer.lock*  ./
RUN composer install --no-autoloader --ansi --no-interaction

# copy files from src folder to var/www/html. 
 WORKDIR /var/www/html
 COPY ./src .

# Run composer dump autoload
RUN composer dump-autoload -o \
 && chown -R :www-data /var/www/html \
    && chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

CMD php artisan serve --host=0.0.0.0 --port=80;

EXPOSE 80

composer.json相关配置片段

{
  "name": "xxx",
  "description": "xxx",
  "license": "Proprietary",
  "type": "project",
   "repositories": [
    {
      "type": "composer",
      "url": "http://repo.backpackforlaravel.com/"
    }
  ],
  "require": {
    "php": "^8.2",
    "ext-dom": "*",
    "ext-filter": "*"
  },
  "config": {
    "allow-plugins": {
      "ergebnis/composer-normalize": true
    },
    "optimize-autoloader": true,
    "preferred-install": "dist",
    "sort-packages": true,
    "auth-files": [
            "auth.json"           
        ]
  }
}

已尝试操作

  • 将auth.json放置在项目src目录(与composer.json同目录)
  • 在composer.json的config节点中添加auth-files配置指定auth.json路径

解决方案

1. 解决GitHub主机密钥验证问题

Docker容器首次连接GitHub时会校验主机密钥,容器内无预存密钥导致验证失败。在Dockerfile的git安装步骤后添加以下内容,提前获取并信任GitHub主机密钥:

# 添加GitHub主机密钥到known_hosts
RUN mkdir -p /root/.ssh \
    && ssh-keyscan github.com >> /root/.ssh/known_hosts

2. 确保Backpack PRO凭证正确

auth.json需包含Backpack私有仓库的认证信息,格式示例:

{
    "http-basic": {
        "repo.backpackforlaravel.com": {
            "username": "你的Backpack账号邮箱",
            "password": "你的Backpack API密钥"
        }
    },
    "github-oauth": {
        "github.com": "你的GitHub个人访问令牌(如需通过Git拉取私有仓库)"
    }
}
  • Backpack API密钥可在官网个人中心获取
  • 优先使用GitHub个人访问令牌通过HTTPS拉取仓库,避免SSH密钥管理复杂问题

3. 调整文件复制顺序与权限

  • 确保auth.json复制后的权限正确,添加:
COPY ./src/auth.json /root/.composer/
RUN chmod 600 /root/.composer/auth.json
  • 当前Dockerfile中先执行composer install再复制src目录会覆盖vendor文件夹,需调整顺序:
    1. 先复制src目录(通过.dockerignore排除本地vendor)
    2. 复制composer相关配置文件
    3. 执行composer安装命令
      修改后步骤:
WORKDIR /var/www/html

# 复制src目录,排除本地vendor(需创建.dockerignore文件)
COPY ./src .

# 复制composer配置文件
COPY ./src/auth.json /root/.composer/
COPY ./src/config.json /root/.composer/
COPY ./src/composer.json ./src/composer.lock* ./

# 安装依赖并配置权限
RUN composer install --no-autoloader --ansi --no-interaction \
    && composer dump-autoload -o \
    && chown -R :www-data /var/www/html \
    && chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

同时在项目根目录创建.dockerignore文件,添加:

vendor/

4. 验证composer仓库配置

确认composer.json中的Backpack仓库配置正确,私有仓库需通过http-basic认证,确保auth.json中对应凭证有效。

内容的提问来源于stack exchange,提问作者shk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:17:08