容器看不到其中预建的供应商文件夹

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 installnpm installnpm run dev

以上是关于容器看不到其中预建的供应商文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 电子预建错误找不到模块“浏览器窗口”Windows 10

预建的 AMQP 和 STOMP 客户端(如 GUI 客户端)

是否有(n)curses的任何树库/小部件[关闭]

在 Windows 资源管理器中看不到在 android 中创建的文件 [重复]

Hibernate 看不到 HSQLDB 中创建的表

OpenFileMapping() 找不到在 COM DLL 中创建的 MMF