带有 Acquia pull 的 DDEV 多站点设置

问题描述

我刚刚设置了 DDEV,并且通过手动运行 ddev import-db --target-db=[db-name] 实现了多站点工作。它工作得很好,但我想弄清楚如何从 Acquia 获取数据库拉取,以便在我可以指定要拉取的站点的地方工作。

我有这个脚本,但有没有办法用更简洁的 DDEV 命令来做到这一点?

首先我将 acquia.yaml 修改为:

environment_variables:
  project_id: mysite.dev
  uri: mysite.com
  db_name: mysite_us

#uri: mysite.ca
#db_name: mysite_canada

#uri: mysite.co.uk
#db_name: mysite_unitedkingdom

# etc etc

db_pull_command:
  command: |
    # set -x   # You can enable bash debugging output by uncommenting
    ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
    pushd /var/www/html/.ddev/.downloads >/dev/null
    acli remote:drush -n ${project_id} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后我编写了以下脚本,我称之为:

./ddev-refresh-db.sh mysite_us mysite.com
#!/bin/bash

site="$1"
uri="$2"

ddev pull acquia
ddev import-db --target-db=${site} --src=.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr

然而,这仍然需要我们在运行此命令之前更改 acquia.yaml 文件中的站点和 URI。

有没有办法将变量传递给 ddev pull acquia ?还有一种方法可以用真正的 DDEV 命令来模拟这个脚本正在做什么?

解决方法

感谢@rfay 的指导,我在 .ddev/providers 中为每个国家/地区设置了一组文件。每一个的结构都是这样的:

environment_variables:
  uri: mysite.be
  db_name: belgium

auth_command:
  command: |
   <no changes>

db_pull_command:
  command: |
    # set -x   # You can enable bash debugging output by uncommenting
    ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
    pushd /var/www/html/.ddev/.downloads >/dev/null
    acli remote:drush -n ${ACQUIA_PROJECT_ID} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后我在 .ddev/commands/host 中创建了一个自定义命令,其中包含我的脚本内容。真实脚本中的案例更多,可以覆盖所有国家。

#!/usr/bin/env bash

## Description: Refresh a database from Acquia and run post-db commands
## Usage: refresh-db [dbname]
## Example: "ddev refresh-db france"

site="$1"

case $site in
  canada)
    uri="mysite.ca"
    ;;
  australia)
    uri="mysite.com.au"
    ;;
  belgium)
    uri="mysite.be"
    ;;
  brazil)
    uri="mysite.com.br"
    ;;
  *)
    site="db"
    uri="mysite.com"
    ;;
esac

ddev pull ${site} -y 2>/dev/null # suppress pull failed message since it really didn't
ddev import-db --target-db=${site} --src=${DDEV_APPROOT}/.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr
ddev drush --uri=${uri} -y pmu simplesamlphp_auth
ddev drush --uri=${uri} -y config-set system.performance css.preprocess 0
ddev drush --uri=${uri} -y config-set system.performance js.preprocess 0

我尝试按照建议在 db_pull_command 期间处理 db 导入,但我无法通过数据库权限错误来导入我尚未使用 ddev import-db 导入的数据库。但是,使用自定义命令,我还可以合并后数据库导入步骤,如果通过 config.yaml 完成,这些步骤通常只会针对默认数据库运行。

我所做的另一个更改是将项目 ID 移动到 global_config.yaml 文件中的 Web 环境设置中。这样,如果我们想要更改我们想要拉取的环境,我们只需在那里编辑项目 ID,而不必编辑提供程序文件。

我没有回馈开源项目的经验,但如果这对其他人有帮助,我很乐意与某人合作,对文档或其所属的任何地方执行拉取请求。

,

我将继续进行一般性回答,但您可以在解决此问题后添加完整的答案。 (我无法访问 Acquia 多站点。)

您走在正确的轨道上,但您可以在拉取脚本中完成所有这些操作。您遇到的问题是 ddev 只假设一个数据库,而您有多个。

这是 acquia.yaml 的策略:

  1. 创建所有数据库。您可以使用 mysql -e "CREATE DATABASE IF NOT EXISTS <dbname>;、多行或 for 循环。
  2. 拉取所有数据库。您可以使用单独的 acli 行执行此操作,或使用 for 循环。
  3. 使用 mysql 命令导入不是主数据库的数据库。 mysql <dbname> < <dbname.sql 同样,这可以是几行或 for 循环。 (您也可以只导入主数据库,它会被 ddev 重新导入,如果它不大也无妨。)

谢谢你提出的好问题,我希望你能在这里给出完整的答案。您的回答也可以合并到 https://ddev.readthedocs.io/en/stable/users/providers/acquia/ 中 - 您可以点击右上角的铅笔链接在那里进行 PR。