未能解决:executor无法运行[/bin/sh-c composer install]:退出代码:1



试图在docker compose build期间从php容器内部运行composer install,但最后出现错误,就像composer.json文件不存在一样。但是,如果我注释掉Dockerfile中的最后一行(即RUN composer install(,然后执行类似docker exec -it <container name> bash的操作,从/var/www/html/composer.json实际存在的容器中手动运行composer install


Dockerfile

FROM php:7.4-apache
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN docker-php-ext-install pdo_mysql mysqli
RUN a2enmod rewrite
WORKDIR /var/www/html
## install and run composer so that this test is self contained
RUN apt-get update
RUN apt-get install -y git
RUN composer install

生成以下

=> ERROR [stage-0 8/8] RUN composer install                                                                                                                                                                       0.5s
------                                                                                                                                                                                                                  
> [stage-0 8/8] RUN composer install:
#0 0.437 Do not run Composer as root/super user! See https://getcomposer.org/root for details
#0 0.446 Composer could not find a composer.json file in /var/www/html
#0 0.446 To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
------
failed to solve: executor failed running [/bin/sh -c composer install]: exit code: 1

如果重要的话,这是docker-compose.yml文件

version: "3.9"
services:
php:
build: ./docker/php
volumes:
- ./src:/var/www/html
ports:
- 8080:80
restart: unless-stopped
mysql:
image: mariadb
volumes:
- ./docker/sql:/docker-entrypoint-initdb.d/
ports:
- 3306:3306
environment:
MARIADB_ROOT_PASSWORD: xxx
MARIADB_DATABASE: xxx
MARIADB_USER: xxx
MARIADB_PASSWORD: xxx
restart: unless-stopped

您已经非常接近容器构建指令了,只是我想说,在构建期间,您只需要composer.json,之后您实际上需要在服务容器中拥有vendor文件夹。

它基本上有两个命令:

首先更新构建说明:

<<'DOCKERFILE' tee Dockerfile >/dev/null && git add Dockerfile && git commit -m 'add composer install to build'
ARG ver=7.4
FROM php:$ver-cli
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
RUN set -ex ; 
apt-get update ; 
apt-get install -y git zip ; 
composer -n validate --strict ; 
composer -n install --no-scripts --ignore-platform-reqs --no-dev
ARG ver=7.4
FROM php:$ver-apache
RUN set -ex ; 
docker-php-ext-install pdo_mysql mysqli ; 
a2enmod rewrite
COPY --from=0 vendor vendor
DOCKERFILE

然后构建容器(这次使用composer.json文件(:

git archive --format tar HEAD Dockerfile composer.json | docker build --no-cache --rm --force-rm --tag my:build -

你会看到它贯穿始终。如果composer.json文件确实存在于构建上下文中,那么在构建容器中进行验证,并且您没有任何网络问题,这应该做到。您没有共享构建上下文属性,因此这是docker中composer的最低要求(Dockerfile+composer.json(。

注意使用中的PHP版本,您会发现它是参数化的,因此可以控制版本。是时候离开即将下线的PHP 7.4了。Docker Compose支持构建参数,因此您可以在不同的工作树中进行构建。

要点是:如果你想从上下文中获得更多文件,请将它们添加到上下文中,并记住,当你需要再次将上下文复制到容器中时,必须没有--from选项,也就是说,只能从其他容器(中间阶段或容器存储库(复制。您可以使用Dockerfile控制所有这些,就像您已经拥有的一样,并在上面再次显示。

最新更新