gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:23:16 26 4
gpt4 key购买 nike

我正在尝试创建一个安装了 npm 和 composer 的 php-apache 容器并运行 composer install , npm 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"]


# docker-compose.yml

version: "3"

services:
painel-admin:
build:
context: ./bin/painel-admin
container_name: 'painel-admin'
command: >
sh -c "php /usr/local/bin/composer install"
restart: 'always'
ports:
- "81:80"
- "82:443"
volumes:
- ${DOCUMENT_ROOT-..}:/var/www/html
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
- ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
- ${LOG_DIR-./logs/apache2}:/var/log/apache2

日志错误:

Action '-D FOREGROUND sh -c php /usr/local/bin/composer install' failed.


如果我尝试使用 npm install 也会出现同样的错误.
我可以在 docker 中运行命令,但我想自动化

最佳答案

我认为您遵循了不正确的方法。这些命令是镜像构建过程的一部分,因此它们应该是 Dockerfile 的一部分。
和构建过程发生 之前 卷可用(容器未运行,因此不可能依赖于这些)。您需要做的是在运行 composer install 之前将必要的文件复制到您正在构建的镜像中。 .
一种更明智的方法,利用 multi-stage build 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"]
这样,您最终生成的镜像不包含任何开发依赖项。该镜像主要用于生产,因此您可以构建和部署它。
要在开发期间在本地运行它,您只需使用所需的卷挂载点在本地运行相同的镜像。您只需要在依赖项更改或升级时重建镜像。
您需要调整路径以使其符合您所需的配置(我正在 /var/www/html 上构建项目,并将网络服务器指向 /var/www/html/public ,但您可以轻松更改这些)。
由于您使用的图像同时包含网络服务器和 PHP 运行时,所以应该是这样。

关于docker - 在容器的每个构建中运行 composer install 和 npm install,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65316170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com