应该从哪个 Dockerfile 中调用 composer install
From which Dockerfile should composer install be called from
我需要调用 composer install
并且不确定从哪个 Dockerfile 调用它 - Dockerfile-apache
或 Dockerfile-php-fpm
?
我应该在 Dockerfile-apache
(和 PHP CLI 中安装 composer 吗?)并从那里 运行 安装它?
运行 composer install from Dockerfile-php-fpm 给我这个:Composer could not find a composer.json file in /var/www/html
Docker-php-fpm
# Do we target a specific version? ie. 7.4.25?
FROM php:7.4-fpm
# Need to add zip and other extensions
RUN buildDeps=" \
libonig-dev \
libzip-dev \
libxml2-dev \
" \
&& apt-get -y update \
&& apt-get install -y $buildDeps zip libicu-dev \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl mbstring json mysqli opcache pdo pdo_mysql xml \
&& apt-get purge -y --auto-remove $buildDeps \
&& rm -r /var/lib/apt/lists/*
# Copying of base conf files
COPY docker/php-fpm/conf/php-fpm.conf /usr/local/etc
COPY docker/php-fpm/conf/php.ini-development /usr/local/etc/php/php.ini
COPY docker/php-fpm/conf/www.conf /usr/local/etc/php-fpm.d
# Install Composer.
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/ \
&& ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
EXPOSE 9000
Docker-apache
:
FROM httpd:2.4
# Copy config files
COPY docker/apache/conf/httpd.conf /usr/local/apache2/conf
COPY docker/apache/conf/httpd-vhosts.conf /usr/local/apache2/conf/extra
# Do something about log rotate?
# Create vhost directory
WORKDIR /var/www/html
#Set our application folder as an environment variable
ENV APP_HOME /var/www/html
#copy files
COPY bin ${APP_HOME}/bin
COPY config ${APP_HOME}/config
COPY plugins ${APP_HOME}/plugins
COPY src ${APP_HOME}/src
COPY webroot ${APP_HOME}/webroot
COPY .htaccess ${APP_HOME}
COPY index.php ${APP_HOME}
COPY composer.json ${APP_HOME}
COPY composer.lock ${APP_HOME}
编辑 #1
docker-compose.yml
version: "3.2"
services:
php-fpm:
container_name: php-fpm
build:
context: .
dockerfile: Dockerfile-php-fpm
networks:
- backend
ports:
- "9000:9000"
apache:
container_name: httpd
build:
context: .
dockerfile: Dockerfile-apache
depends_on:
- php
networks:
- frontend
- backend
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
编辑#2
此 docker-compose 文件支持通过公共卷进行通信。此时我只需要在 Apache 中编译、构建和复制文件。
version: "3.9"
services:
php-fpm:
container_name: php-fpm
build:
context: .
dockerfile: Dockerfile-php-fpm
volumes:
- mydata:/var/www/html:rw
networks:
- backend
ports:
- "9000:9000"
apache:
container_name: httpd
build:
context: .
dockerfile: Dockerfile-apache
depends_on:
- php
volumes:
- mydata:/var/www/html:rw
networks:
- frontend
- backend
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
volumes:
mydata:
我不会选择以上任何一种;相反,运行 composer install
在本地复制生成的 vendor
目录作为应用程序的一部分 .
获取依赖项基本上是构建应用程序的一部分,而不是运行宁应用程序的一部分,因此 Composer 不应该甚至不能安装在生产主机或容器上。如果您正在编写一个需要使用 gcc
进行编译的 C 应用程序,您将 运行 作为较早的步骤,然后将二进制文件复制到容器中; composer install
也可以这样处理。
因此,例如,您可能有一个构建脚本(到 运行 手动,或在 CI 服务器中,如 Jenkins、Github Actions、Azure DevOps 等)通过以下步骤:
- 从 git 存储库克隆存储库
- 查看最新标签
- 运行
composer install
- 运行 一个脚本来缩小 client-side JS
- 运行
docker-composer
,复制源码,压缩JS,vendor
目录
insideDocker容器中的软件因此只需要能够运行应用程序,不是 构建 它。
我需要调用 composer install
并且不确定从哪个 Dockerfile 调用它 - Dockerfile-apache
或 Dockerfile-php-fpm
?
我应该在 Dockerfile-apache
(和 PHP CLI 中安装 composer 吗?)并从那里 运行 安装它?
运行 composer install from Dockerfile-php-fpm 给我这个:Composer could not find a composer.json file in /var/www/html
Docker-php-fpm
# Do we target a specific version? ie. 7.4.25?
FROM php:7.4-fpm
# Need to add zip and other extensions
RUN buildDeps=" \
libonig-dev \
libzip-dev \
libxml2-dev \
" \
&& apt-get -y update \
&& apt-get install -y $buildDeps zip libicu-dev \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl mbstring json mysqli opcache pdo pdo_mysql xml \
&& apt-get purge -y --auto-remove $buildDeps \
&& rm -r /var/lib/apt/lists/*
# Copying of base conf files
COPY docker/php-fpm/conf/php-fpm.conf /usr/local/etc
COPY docker/php-fpm/conf/php.ini-development /usr/local/etc/php/php.ini
COPY docker/php-fpm/conf/www.conf /usr/local/etc/php-fpm.d
# Install Composer.
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/ \
&& ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
EXPOSE 9000
Docker-apache
:
FROM httpd:2.4
# Copy config files
COPY docker/apache/conf/httpd.conf /usr/local/apache2/conf
COPY docker/apache/conf/httpd-vhosts.conf /usr/local/apache2/conf/extra
# Do something about log rotate?
# Create vhost directory
WORKDIR /var/www/html
#Set our application folder as an environment variable
ENV APP_HOME /var/www/html
#copy files
COPY bin ${APP_HOME}/bin
COPY config ${APP_HOME}/config
COPY plugins ${APP_HOME}/plugins
COPY src ${APP_HOME}/src
COPY webroot ${APP_HOME}/webroot
COPY .htaccess ${APP_HOME}
COPY index.php ${APP_HOME}
COPY composer.json ${APP_HOME}
COPY composer.lock ${APP_HOME}
编辑 #1
docker-compose.yml
version: "3.2"
services:
php-fpm:
container_name: php-fpm
build:
context: .
dockerfile: Dockerfile-php-fpm
networks:
- backend
ports:
- "9000:9000"
apache:
container_name: httpd
build:
context: .
dockerfile: Dockerfile-apache
depends_on:
- php
networks:
- frontend
- backend
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
编辑#2
此 docker-compose 文件支持通过公共卷进行通信。此时我只需要在 Apache 中编译、构建和复制文件。
version: "3.9"
services:
php-fpm:
container_name: php-fpm
build:
context: .
dockerfile: Dockerfile-php-fpm
volumes:
- mydata:/var/www/html:rw
networks:
- backend
ports:
- "9000:9000"
apache:
container_name: httpd
build:
context: .
dockerfile: Dockerfile-apache
depends_on:
- php
volumes:
- mydata:/var/www/html:rw
networks:
- frontend
- backend
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
volumes:
mydata:
我不会选择以上任何一种;相反,运行 composer install
在本地复制生成的 vendor
目录作为应用程序的一部分 .
获取依赖项基本上是构建应用程序的一部分,而不是运行宁应用程序的一部分,因此 Composer 不应该甚至不能安装在生产主机或容器上。如果您正在编写一个需要使用 gcc
进行编译的 C 应用程序,您将 运行 作为较早的步骤,然后将二进制文件复制到容器中; composer install
也可以这样处理。
因此,例如,您可能有一个构建脚本(到 运行 手动,或在 CI 服务器中,如 Jenkins、Github Actions、Azure DevOps 等)通过以下步骤:
- 从 git 存储库克隆存储库
- 查看最新标签
- 运行
composer install
- 运行 一个脚本来缩小 client-side JS
- 运行
docker-composer
,复制源码,压缩JS,vendor
目录
insideDocker容器中的软件因此只需要能够运行应用程序,不是 构建 它。