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文件夹,需调整顺序:- 先复制src目录(通过
.dockerignore排除本地vendor) - 复制composer相关配置文件
- 执行composer安装命令
修改后步骤:
- 先复制src目录(通过
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
相关产品推荐
相关产品推荐

