使用php composer的Docker项目,将composer包安装在根目录中,而不是供应商



我有一个php/wordpress项目,它需要composer。项目设置简单而简单。

docker-compose.yaml

version: "3.9"
services:
# Database
clearlaw-mysql1:
image: mysql:8
volumes:
- database:/var/lib/mysql
restart: on-failure
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- clearlaw
# Wordpress
clearlaw-wp1:
container_name: clearlaw-wp1
build:
context: .
depends_on:
- clearlaw-mysql
image: wordpress:latest
ports:
- 10002:80
restart: unless-stopped
CLI_MULTISITE_DEBUG: 1
CLI_MULTISITE_DEBUG_DISPLAY: 1
CLI_MULTISITE_DB_HOST: clarlaw-mysql:3306
CLI_MULTISITE_DB_NAME: wordpress
CLI_MULTISITE_DB_USER: wordpress
CLI_MULTISITE_DB_PASSWORD: wordpress
networks:
- clearlaw
clearlaw-adminer1:
image: adminer
ports:
- 10003:8080
restart: unless-stopped
networks:
- clearlaw
networks:
clearlaw:
volumes:
database:

Dockerfile

FROM wordpress:latest
# INSTALL AND UPDATE COMPOSER
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN composer self-update

COPY composer.json .
RUN composer install --prefer-dist
RUN composer dump-autoload
COPY . .
EXPOSE 80

composer.json

{
"require": {
"vlucas/phpdotenv": "^v2.6.7",
"dompdf/dompdf": "^1.0"
}
}

当我运行此安装程序时,我会收到致命错误autoload.php文件不在它应该在的位置(/vendor/autoload(。相反,它与所有已安装的pacakges一起位于根目录中。供应商目录存在,但为空。

Example Directory structure:

-- autoload.php
vendor # empty
composer
wp-content
wp-admin
wp-includes
# all other files

我尝试了什么

我曾尝试在composer.json中显式添加供应商目录,但对没有帮助

{
"config": {
"vendor-dir": "vendor"
},
"require": {
"vlucas/phpdotenv": "^v2.6.7",
"dompdf/dompdf": "^1.0"
}
}

更新

我为您创建了此存储库以进行快速测试https://github.com/prionkor/wp-composer-test

wordpress:latest容器在/var/www/html中指定了一个卷,该卷也是容器的工作目录。

当你把你的docker组合起来时,(匿名(卷就会被创建,容器入口点脚本(/usr/local/bin/docker-entrypoint.sh(将WordPress源复制到新的卷中。

通常,只有在之后,供应商目录为/var/www/html/vendorcomposer install才会而不会被丢弃。

由于Dockerfile建筑FROM wordpress:latest中有composer install,因此会创建vendor文件夹,但随后会将其丢弃。现在不是太早就是太迟,这取决于你从哪里看。

因此,您可以从Dockerfile中删除RUN composer ...指令,这些指令实际上只会延长构建时间。

FROM wordpress:latest
# INSTALL AND UPDATE COMPOSER
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN composer self-update
COPY . .
EXPOSE 80

然后进行composer安装(之后不需要转储自动加载(,并在启动容器时执行基本容器入口点:

# WordPress
build:
context: .
command: /bin/bash -c "set -ex; composer update --prefer-dist; exec docker-entrypoint.sh apache2-foreground"

然后Composer安装到卷中,有效地安装到/var/www/html/vendor

最初的WordPress容器设置会发出警告,文件夹不再是空的,但它不会阻止WordPress的初始化,所以你可以忽略它:

WARNING: /var/www/html is not empty! (copying anyhow)

Composer然后在您最初启动项目时安装构建上下文Composer.json/Composer.lock(如果composer.lock文件在容器外的项目中处于领先地位,请使用composer install而不是composer update(。

然后你可以运行

docker-compose up -d --build

从头开始重新创建WordPress服务容器,Composer再次填充供应商文件夹。

通常,这是您可以从命令运行程序(例如Makefile(中获益匪浅的时候。然后,项目中的标准操作就触手可及了。

这里有一个作曲家更新目标:

wordpress := clearlaw-wp1
cu: composer-update;
composer-update:
tar -c -f- composer.json 
| docker cp - $(wordpress):/var/www/html
docker-compose exec $(wordpress) composer update

然后在shell中为该文件别名make命令(例如alias dc="make -C $(pwd) -f Makefile"(,然后只需要键入dc cu即可执行更新。

您可以将它进一步扩展到其他操作中,也可以在示例中注释这些卷时对它们进行实验。例如,您可以在现有卷/var/www/html中以只读方式装载内容,只是不能直接在那个位置。

您也可以装载单个文件。例如,为了扩展composer示例,您还可以将composer.json(和composer.lock(文件装载到容器中,然后可以将tar管道保留到docker cp。这也是一个示例,当它在两个方向上工作时,您可以如何将文件从容器中取出。

command: /bin/bash -c "set -x; composer update --prefer-dist; exec docker-entrypoint.sh apache2-foreground"
volumes: ["./composer.json:/var/www/html/composer.json:ro"]

然后你可以运行

docker-compose up -d --build

再次创建容器并触发Composer更新。


还有一点要注意:小心vlucas/phpdotenv包,如果你不遵守dot-env文件(shell、docker等(的标准语法规则,它很容易与docker/docker-compose不兼容。通常情况下,容器设置也不需要它。

相关内容

  • 没有找到相关文章

最新更新