如何将 docker 与 drupal 和 drush 一起使用?

2024-01-03

我想用drush https://github.com/drush-ops/drush。它需要在drupal容器中运行。还有一个drush docker 仓库 https://hub.docker.com/r/drush/drush。但我不知道如何在 drupal 容器中使用它。这是我的第一个 docker 和 drupal 项目,所以也许我完全搞错了。

如何将 drush 与这个 drupal docker 镜像一起使用?https://hub.docker.com/_/drupal/ https://hub.docker.com/_/drupal/可以用 docker-compose 来管理吗?也许扩展 drupal 容器?

这是我的docker-compose.yml:

mysql:
  image: mysql:5.5
  ports:
    - "3306:3306"
  environment:
    - MYSQL_USER=xxxxx
    - MYSQL_PASSWORD=xxxxxx
    - MYSQL_ROOT_PASSWORD=xxxxxx
    - MYSQL_DATABASE=xxxxxx

drupal:
  image: drupal:8.0.4
  links:
    - mysql
  ports:
    - "8080:80"

我花了太多时间让它发挥作用。这是我的发现。

像OP一样,我从来没有让drush镜像在本地docker网络上工作,所以对我来说通过composer将drush与drupal镜像捆绑在一起似乎更简单(参见下面的Dockerfile)。

这有点有效,如果你执行到容器中,你可以运行 drush status,但它不会连接到 mysql 服务器。有两个原因:

  1. 需要 mysql-client 包来远程连接到数据库(因为我们在本地 docker 网络上运行它)。

  2. mysql 主机名需要在 docker-compose 文件(或 docker run 命令)中显式设置。


这是我的 Dockerfile:

FROM drupal:8.3.7-apache

# Install packages
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
    apt-get update && apt-get install --no-install-recommends -y \
    curl \
    wget \
    vim \
    git \
    unzip \
    mysql-client

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer && \
    ln -s /root/.composer/vendor/bin/drush /usr/local/bin/drush

# Install Drush
RUN composer global require drush/drush && \
    composer global update

# Clean repository
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

重要的包是curl(显然)和mysql-client.

这些是 docker-compose.yml 的相关部分:

version: '3.3'

services:

  drupal:
    image: drupal
    build: ./docker/drupal
    env_file:
      - ./docker/environment.env
    ports:
      - "8080:80"
    depends_on:
      - mysql
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    volumes:
      - ./docker/phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
    env_file:
      - ./docker/intervention/environment.env
    ports:
      - "8080:80"
    depends_on:
      - mysql
    restart: always

  mysql:
    image: mysql
    build: ./docker/mysql
    env_file:
      - ./docker/environment.env
    hostname: mysql
    ports:
      - 3306:3306
    volumes:
      - mysql-data-d8:/var/lib/mysql
    restart: always

volumes:
  mysql-data-d8:

为什么显式设置主机名有效

上面的第二个问题尤其严重,因为 drush 使用 settings.php 中的配置来连接到 mysql。但数据库数组中的“主机”键显然由 drupal 和 drush 进行不同的解释。这是相关部分settings.php:

$databases = array (
  'default' => array (
    'default' => array (
      'database' => $envs['MYSQL_DATABASE'] ?? '',
      'username' => $envs['MYSQL_USER'] ?? '',
      'password' => $envs['MYSQL_PASSWORD'] ?? '',
      'host' => 'mysql',//php_sapi_name() === 'cli' ? 'a8597b38be21' : 'mysql',
      'port' => '3306',
      'driver' => 'mysql',
      'prefix' => 'drupal_',
      'charset' => 'utf8mb4',
      'collation' => 'utf8mb4_general_ci',
      'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    ),
  ),
);

之后的注释行'host' => 'mysql'是之前从另一个 SO 答案中进行的尝试并说明了问题,drush 使用命令行服务器 API,这与 drupal 使用的任何内容都不同。备用主机名是正在运行的容器的哈希 ID,可以通过运行 sql 找到它(例如来自 phpmyadmin):

SHOW VARIABLES WHERE Variable_name = 'hostname'(采取形式this https://serverfault.com/questions/129635/how-do-i-find-out-what-my-ip-address-of-my-mysql-host-is)

每次更新容器时该值都会更改,因此为了使其持久存在,主机名在docker-compose.yml,如上。


编辑:我制作了一个小项目来托管基于此的 drupal + drush + phpmyadmin 开发环境:https://github.com/glaux/drupal8docker https://github.com/glaux/drupal8docker

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 docker 与 drupal 和 drush 一起使用? 的相关文章

随机推荐

  • Rails - Devise - 创建注册表

    我一直在用头撞墙 试图了解如何让 Devise 与客户注册一起工作 因此 在我的登陆页面上 我想显示注册表单 因此我将其添加到我的视图中 在该部分中 我在视图中有一个表单标签 如下所示 在我的应用程序布局中 我有 div class div
  • 为什么 API 应返回“void”?

    在编写 API 或可重用对象时 是否有任何技术原因导致所有返回 void 的方法调用不应只返回 this C 中的 this 例如 使用 string 类 我们可以做这样的事情 string input string Join input
  • 如何处理大型二维数组

    我有一个大小为 5428x5428 的二维数组 它是一个对称数组 但是在编译时它给了我一个错误 说数组大小太大 谁能给我提供方法吗 这个数组对于程序堆栈内存来说太大了 这是你的错误 int main double arr 5428 5428
  • 将相机渲染到多个表面 - 屏幕上和屏幕外

    我想将相机输出渲染到视图中 并偶尔将相机输出帧保存到文件中 约束是 保存的帧应该是相同分辨率当相机被配置时 而视图是小于相机输出 保持纵横比 基于grafika 中的 ContinuousCaptureActivity 示例 https g
  • python 检查一个方法是否被调用而不模拟它

    class A def tmp self print hi def b a a tmp 要检查 b 中是否调用了 tmp 方法 推荐的方法是 a A a tmp MagicMock b a a tmp assert called 但这里的
  • 模块中具有相对于调用该模块的文件的相对路径

    假设我有当前的文件结构 应用程序 模块 module py 应用程序 模块 somefile txt 应用程序 脚本 script py 应用程序 main py 模块 script py import sys sys path appen
  • 组合多个 NSArray

    如何将多个 NSArray 组合成一个具有交替值的数组 例如 系列一 橙子 苹果 梨 阵列二 乔木 灌木 花卉 阵列三 蓝色 绿色 黄色 最终的数组需要是 橙色 树木 蓝色 苹果 灌木 绿色等 1 2 3 4 5 6 valueForKey
  • 如何发送文本消息而不是字节消息

    我正在使用与我的 JMS 队列对话的 blueprint xml 构建骆驼路线 我遇到了神秘的错误 我的 Spring Boot 应用程序充当队列的消费者 将我的 xml 作为字节消息而不是文本消息发送 并且 Spring 消费者对此感到窒
  • Google Sheet OAuth 范围只能访问几个文件?

    我们有一个受限制的应用程序 我们可以在其中控制用户帐户的创建 我们还使用 Google 登录 目前 该应用程序尚未经过验证 但它很好 因为所有用户都在我们的 GSuite 域中 但我们希望将其扩展到 GSuite 域之外的用户 用户可以在我
  • Nginx 多个 Node JS Express 应用程序的多个位置

    我有以下配置 location proxy set header X Real IP remote addr proxy set header X Forwarded For proxy add x forwarded for proxy
  • 如何配置 asp.net kestrel 实现低延迟?

    我正在尝试实现一个 asp net 2 2 应用程序 以尽可能低的速度服务 HTTP 请求latency 不是吞吐量 它不是为了生产而是为了某种竞争 该应用程序应该在具有 4 个核心的 Linux docker 容器环境中运行 并且我的处理
  • 使用 PHP 解压较大的文件

    我正在尝试使用 PHP 解压 14MB 存档 代码如下 zip zip open c kosmas zip while zip entry zip read zip fp fopen c unzip import xml w if zip
  • 将当前用户添加到 NLog 输出

    我想向 NLog 输出的每一行添加一个字符串 逻辑保持不变 尝试获取当前用户 如果成功 则将当前用户添加到输出中 我每次都知道如何实现它 但我想将这个模板设置在一个地方 而不是每次编写时都重复它 The WindowsIdentityLay
  • Spring Boot 应用程序与 ECS 中运行的 AWS Distro for OpenTelemetry (ADOT) 之间的通信失败

    我正在尝试在 ECS 中运行 Spring Boot 应用程序 并使用 ADOT 作为边车 在 ECS 任务定义中 我正在为 Spring Boot 应用程序创建任务 我正在启用 Use Metrics Collection 并选择 Ama
  • ActivityManager进程已死亡问题

    我的应用程序包含 5 个屏幕 在第一个屏幕中 我从服务器加载一些数据 并在第二个屏幕的列表视图中显示这些数据 在列表视图中 我必须为每一行显示一个图像 这些图像是动态下载的并且也被缓存 下载发生在后台 我已经为列表视图提供了notifyDa
  • 如何确定字符串中包含的数据类型?

    我有一个接受字符串参数的方法 字符串可以包含整数 长整型 双精度型 布尔型或只是普通的旧字符和数字 我需要一种简单的方法来确定字符串的类型 一种方法可能是使用一堆 try catch 块并尝试将其解析为每种类型 如果抛出异常 则它可能不是该
  • 单击删除父 div

    我正在尝试通过单击链接来删除 div 问题是相同的 div 和链接有多个结构 我尝试制作一个函数 但它删除了所有 div document on click fd bxx cls function e e preventdefault th
  • 如何修复这个 MySQL 触发器?

    我正在尝试让这个触发器发挥作用 CREATE TRIGGER Transaction insert BEFORE INSERT ON Transaction FOR EACH ROW WHERE Number NEW AccountNumb
  • Go 中生产者/消费者最简洁的习惯用法是什么?

    我想做的是拥有一组生产者 goroutine 其中一些可能完成也可能不完成 和一个消费者例程 问题在于括号中的警告 我们不知道将返回答案的总数 所以我想做的是 package main import fmt math rand func p
  • 如何将 docker 与 drupal 和 drush 一起使用?

    我想用drush https github com drush ops drush 它需要在drupal容器中运行 还有一个drush docker 仓库 https hub docker com r drush drush 但我不知道如何