在容器的每个构建中运行 composer install 和 npm install

And*_*ker 2 npm composer-php docker docker-compose

我试图创建一个PHP的Apache与新公共管理和作曲家安装并运行容器composer installnpm install在每次构建,但我得到的错误。

# Dockerfile

FROM php:7.4-apache

RUN apt-get -y update && apt-get upgrade -y

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        npm \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

# Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Enable apache modules
RUN a2enmod rewrite headers

EXPOSE 80
#RUN composer install
#RUN npm install

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]


Run Code Online (Sandbox Code Playgroud)
# Dockerfile

FROM php:7.4-apache

RUN apt-get -y update && apt-get upgrade -y

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        npm \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

# Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Enable apache modules
RUN a2enmod rewrite headers

EXPOSE 80
#RUN composer install
#RUN npm install

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]


Run Code Online (Sandbox Code Playgroud)

日志错误:

操作“-D FOREGROUND sh -c php /usr/local/bin/composer install”失败。

如果我尝试使用npm install.

我可以在 docker 中运行命令,但我想自动化

yiv*_*ivi 5

我认为您遵循了不正确的方法。这些命令是映像构建过程的一部分,因此它们应该是 Dockerfile 的一部分。

并且构建过程发生卷可用之前(容器未运行,因此不可能依赖于这些)。您需要做的是在运行之前将必要的文件复制到您正在构建的映像中composer install

利用多阶段构建dockerfiles 的更明智的方法是:

## First stage. Copy project files and run composer
FROM composer:2 as composer_stage

RUN rm -rf /var/www && mkdir -p /var/www/html
WORKDIR /var/www/html

COPY composer.json composer.lock symfony.lock .env ./
COPY public public/

RUN composer install --ignore-platform-reqs --prefer-dist --no-scripts --no-progress --no-suggest --no-interaction --no-dev --no-autoloader

RUN composer dump-autoload --optimize --apcu --no-dev

COPY bin bin/
COPY config config/
COPY src src/

RUN composer run-script $NODEV post-install-cmd; \
    chmod +x bin/console;

## Second stage. Build NPM dependencies

FROM node:12 as npm_builder

COPY --from=composer_stage /var/www/html /var/www/html

WORKDIR /var/www/html
COPY yarn.lock package.json webpack.config.js ./
COPY assets ./assets

RUN yarn install
RUN yarn encore prod

# I'm using yarn here, but using npm would be similar, depending on how your project is setup

# RUN npm install
# RUN npm run build # if necessary and the command exists in your project

## Third stage, mostly copied from your original Dockerfile

FROM php:7.4-apache

RUN apt-get -y update && apt-get upgrade -y

COPY --from=npm_builder /var/www/html /var/www/html

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        npm \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

# Enable apache modules
RUN a2enmod rewrite headers

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Run Code Online (Sandbox Code Playgroud)

这样,您最终生成的映像不包含任何开发依赖项。该映像主要用于生产,因此您可以构建和部署它。

要在开发期间在本地运行它,您只需使用所需的卷挂载点在本地运行相同的映像。您只需要在依赖项更改或升级时重建映像。

您需要调整路径以使其符合您所需的配置(我正在构建项目/var/www/html并将网络服务器指向/var/www/html/public,但您可以轻松更改这些路径)。

由于您使用的图像同时包含网络服务器和 PHP 运行时,所以应该是这样。