繁体   English   中英

Docker 项目与 php 作曲家,将作曲家包安装在根目录而不是供应商

[英]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 installDockerfile建筑物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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM