[英]Docker project with php composer, installs composer packages in root directory instead of vendor
我有一个需要作曲家的 php/wordpress 项目。 项目设置简单且最小。
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-compose 时,将创建(匿名)卷,并且容器入口点脚本 ( /usr/local/bin/docker-entrypoint.sh
) 将 WordPress 源复制到新卷中。
一般来说,只有在那之后,在/var/www/html/vendor
上使用供应商目录composer install
不会被丢弃。
当您将composer install
在Dockerfile
建筑物FROM wordpress:latest
时, 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 install (之后不需要转储自动加载)并在启动容器时执行基本容器入口点:
# 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 中为该文件设置别名(例如alias dc="make -C $(pwd) -f Makefile"
),然后您只需键入dc cu
即可执行更新。
您可以进一步扩展它以进行其他操作,并且您还可以尝试使用您在示例中注释掉的卷。 例如,您可以在现有卷/var/www/html
内以只读方式安装内容,但不能直接在该位置。
您还可以挂载单个文件。 例如,要扩展作曲家示例,您也可以将composer.json
(和composer.lock
)文件安装到容器中,然后您可以将 tar-pipe 保留到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 更新。
And a side-note: Take a bit of care with the vlucas/phpdotenv
package, it can become easily incompatible with docker / docker-compose if you don't follow the standard syntax rules for dot-env files (shell, docker etc.). 通常你也不需要它来设置容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.