composer在Dockerfile中的安装没有保存依赖项



我很难将Symfony项目固定化。从git-reo克隆开始,依赖项必须通过composer安装。

我读过很多相同背景的问题,但我无法理解。

我先给你看我的Dockerfile:

ARG PHP_VERSION=8.1
ARG APP_ENV=dev
# Prod image
FROM php:${PHP_VERSION}-fpm-alpine AS app_php
# Update
RUN apk --no-cache update
RUN apk --no-cache add bash git
# Install Node
RUN apk --no-cache add --update nodejs npm
RUN apk --no-cache add --update python3
RUN apk --no-cache add --update make
RUN apk --no-cache add --update g++
# Install pdo
RUN docker-php-ext-install pdo_mysql
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Symfony CLI
RUN curl -sS https://get.symfony.com/cli/installer | bash && mv /root/.symfony/bin/symfony /usr/local/bin/symfony
# WORK DIR
WORKDIR /var/www/html
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV PATH="${PATH}:/root/.composer/vendor/bin"
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# prevent the reinstallation of vendors at every changes in the source code
COPY composer.* symfony.* ./
RUN set -eux; 
if [ -f composer.json ]; then 
composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress; 
composer clear-cache; 
fi
RUN set -eux; 
mkdir -p var/cache var/log; 
if [ -f composer.json ]; then 
composer dump-autoload --classmap-authoritative --no-dev; 
composer dump-env prod; 
composer run-script --no-dev post-install-cmd; 
chmod +x bin/console; sync; 
fi

# copy sources
COPY . /var/www/html
RUN rm -Rf docker/
# Start Symfony server on Port 8000
EXPOSE 8000
#RUN symfony console doctrine:migrations:migrate

我可以看到这些包是通过构建过程安装的,但在docker-compose up之后,供应商文件夹没有设置。

你有解决这个问题的办法吗?

为您运行它,实际上没有您期望的供应商文件。

如果你在你的容器上运行一个shell,你会看到真正发生了什么:

使用docker image ls获取您创建的容器id或标签运行它:

docker run --rm -it <CONTAINER_ID> /bin/bash
bash-5.1# ls /var/www/html/
Dockerfile  composer.1  composer.2  symfony.1   var
bash-5.1# ls -al /root/.composer/
total 8
drwxr-xr-x    1 root     root            50 Aug 14 15:47 .
drwx------    1 root     root            16 Aug 14 15:48 ..
-rw-r--r--    1 root     root           799 Aug 14 15:47 keys.dev.pub
-rw-r--r--    1 root     root           799 Aug 14 15:47 keys.tags.pub
bash-5.1# ls /usr/bin/composer
/usr/bin/composer
bash-5.1# ls /usr/local/bin/composer 
/usr/local/bin/composer
bash-5.1# which composer
/usr/local/bin/composer
bash-5.1# which symfony
/usr/local/bin/symfony
bash-5.1# 

哪个命令会让你意识到:

  • 当您已经安装composer时,您不需要复制它
  • /usr/local/bin已经是PATH的一部分
  • 当前ENV命令不是必需的,加上指向不存在的文件夹

仅供参考,我创建了假的symfony.*和composer.*文件,没有composer.json(此处未共享(。

我希望这能帮助你解决问题。

最新更新