【问题标题】: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 的绝地武士。

感谢您的任何帮助/建议!

【问题讨论】:

  • 你尝试过什么调试问题?

标签: php laravel docker docker-compose composer-php


【解决方案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
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2018-03-17
  • 2019-06-15
  • 1970-01-01
相关资源
最近更新 更多