容器看不到其中预建的供应商文件夹
Posted
技术标签:
【中文标题】容器看不到其中预建的供应商文件夹【英文标题】:Container cannot see the prebuilt vendor folder in it 【发布时间】:2021-05-12 21:56:19 【问题描述】:我的项目在重启docker容器后抛出下一个错误:
警告:需要(/var/www/ /var/www/ /vendor/composer/./symfony/polyfill-php80/bootstrap.php): 失败 打开流:中没有这样的文件或目录 '供应商/作曲家/autoload_real.php 第 71 行
我的 Dockerfile:
FROM php:8.0-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/project/
# Set working directory
WORKDIR /var/www/project
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl \
libicu-dev \
libonig-dev \
libzip-dev
# install node
RUN curl -sL https://deb.nodesource.com/setup_current.x | bash -
RUN apt-get install -y nodejs
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
RUN docker-php-ext-configure gd --enable-gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/
RUN docker-php-ext-install gd
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
RUN pecl install xdebug && docker-php-ext-enable xdebug
RUN echo 'xdebug.client_port=9000' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.mode=debug' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.discover_client_host=true' >> /usr/local/etc/php/php.ini
RUN echo 'memory_limit = 4G' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini;
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory permissions
COPY --chown=www:www . /var/www/project
RUN composer install
RUN npm install
RUN npm run dev
RUN php artisan storage:link
ENV PATH="vendor/bin:$PATH"
# Change current user to www
USER www
RUN composer global require tightenco/tlint
ENV PATH="$PATH:/home/www/.composer/vendor/bin"
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
我的 docker-compose:
...
project:
build:
context: ./project/.
dockerfile: Dockerfile
image: project:v0
restart: unless-stopped
tty: true
environment:
PHP_IDE_CONFIG: serverName=docker_project
XDEBUG_CONFIG: remote_host=172.17.0.1
SERVICE_NAME: project
SERVICE_TAGS: dev
volumes:
- /var/www/project/vendor/
- ./project:/var/www/project
- ./project/.docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- project-network
...
在重启容器之前在容器内运行ls vendor/symfony
:
之后:
如果删除供应商目录并运行composer install
,错误正在解决。
我不是 Docker 的绝地武士。
感谢您的任何帮助/建议!
【问题讨论】:
你尝试过什么调试问题? 【参考方案1】:在您的卷部分,您将主机文件夹 ./project
挂载到容器的 /var/www/project
:
volumes:
- /var/www/project/vendor/
- ./project:/var/www/project
- ./project/.docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
供应商文件夹通过RUN
命令在您的容器内构建。它可能还在那里。但是,当您运行docker-compose up
时,您指示它在运行它时用主机的./project
文件夹掩盖其中的任何内容。所以容器看不到你之前构建的任何东西。
我的建议是只挂载您需要不时更改的文件夹。例如:
volumes:
- /var/www/project/vendor/
# You're probably uploading files here
- ./project/public/assets:/var/www/project/public/assets
# Note: You might need to mount some other files / folders that changes
- ./project/.docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
然后容器将正确使用预构建的/vendor
,同时存储您需要保留在主机中的东西。
【讨论】:
感谢您的回答!但我需要./project:/var/www/project
才能在不重新启动的情况下更改容器内的代码。在这种情况下我需要做什么?
@Orange-Man:对于生产,您最好像现在这样预先构建一些东西(只是不安装整个/var/www/project
)。对于开发,您应该改为在主机中执行composer install
、npm install
和npm run dev
。以上是关于容器看不到其中预建的供应商文件夹的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 电子预建错误找不到模块“浏览器窗口”Windows 10
预建的 AMQP 和 STOMP 客户端(如 GUI 客户端)