我很难将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(此处未共享(。
我希望这能帮助你解决问题。