【问题标题】:Docker project with php composer, installs composer packages in root directory instead of vendor带有 php composer 的 Docker 项目,将 composer 包安装在根目录而不是 vendor
【发布时间】:2022-10-09 04:38:57
【问题描述】:

我有一个需要作曲家的 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

【问题讨论】:

    标签: php wordpress docker docker-compose composer-php


    【解决方案1】:

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

    当您启动 docker-compose 时,会创建(匿名)卷,并且容器入口点脚本 (/usr/local/bin/docker-entrypoint.sh) 会将 WordPress 源代码复制到新卷中。

    一般只composer install 与供应商目录 /var/www/html/vendor不是被丢弃。

    当您在 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 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 更新。


    附带说明:请注意vlucas/phpdotenv 包,如果您不遵循 dot-env 文件(shell、docker 等)的标准语法规则,它很容易与 docker / docker-compose 不兼容。 )。通常你也不需要它来进行容器设置。

    【讨论】:

      【解决方案2】:

      你有没有设置好并运行@Sisir?我正在解决同样的问题:使用 Composer 在 Docker 中处理 WordPress 没有运气。

      我已经看了很多@hakre 大纲的步骤,但我似乎无法让它运行。 我也试过这个例子:Composer not installing wordpress plugins through dockerfile 但这里也没有运气......

      WordPress 安装将按预期初始化 - 但是当我在浏览器中完成 WordPress 安装指南时,我只看到默认插件,而不是我的 composer.json 文件中的插件。

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2015-07-11
        • 2012-06-21
        • 2015-07-14
        相关资源
        最近更新 更多