maxbucknell / eisenhardt
不包括电池的 Docker 环境,适用于 Magento 2。
Requires
- symfony/console: ^3.2
- symfony/filesystem: ^3.2
- dev-master
- 7.1.x-dev
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.0
- dev-macos
- dev-standup
- dev-remove-unused-deps
- dev-fix-container-rename
- dev-xdebug-fix
- dev-fix-ssl-dev
- dev-cache-build
- dev-ssl-bug
- dev-container-rename
- dev-elastic
- dev-docker-compose-3
- dev-rabbitmq-hostname
- dev-tls
- dev-remove-alpine
- dev-continuous-integration
- dev-update-readme
- dev-permissions
- dev-test
This package is not auto-updated.
Last update: 2024-09-29 04:23:47 UTC
README
一个基于 Docker 的“不包括电池”的 Magento 2 开发环境最佳实践。
这意味着这仅包含服务器配置,并且在安装 Magento 时不做任何魔术处理。我们发现我们需要一个最佳实践的开发环境来处理我们已有的项目。因此,Eisenhardt 对您的项目配置并不挑剔。您只需要在项目的根目录中设置它。
Eisenhardt 是 Docker Compose 的一个非常薄的包装器。
安装
依赖项
通过 Composer 安装!
composer global require maxbucknell/eisenhardt
入门
这将引导您设置一个干净的 Magento 安装。要在现有项目中使用 Eisenhardt,请参阅下面的相关部分。
首先,创建一个 Magento 2 项目
composer create-project \
--repository-url=https://repo.magento.com/ \
magento/project-community-edition:~2.1.0 \
--no-install \
test-eisenhardt
这将在 test-eisenhardt
目录中创建一个 Magento 2 基础项目。切换到它,并设置 Eisenhardt
eisenhardt init test-eisenhardt.loc eisenhardt start
现在我们可以开始安装 Magento。第一步是依赖项
eisenhardt run -- composer install
现在可能是确保权限正确的时候了
eisenhardt fix-permissions
并确保数据库存在
eisenhardt run -- mysql -hdatabase -uroot -proot MySQL [(none)]> create database showoff;
然后进行安装。以下命令将完成所有操作,但如有需要,您可以随意更改。
eisenhardt run -- n98-magerun2 setup:install \ --backend-frontname="admin" \ --db-host="database" \ --db-name="showoff" \ --db-user="root" \ --db-password="root" \ --http-cache-hosts="varnish:6081" \ --base-url="http://test-eisenhardt.loc/" \ --language="en_US" \ --timezone="UTC" \ --currency="EUR" \ --admin-user="magento.admin" \ --admin-password="password123" \ --admin-email="magento.admin@example.com" \ --admin-firstname="Magento" \ --admin-lastname="Admin"
如果您正在运行企业版,您可以使用以下参数配置消息队列框架
--amqp-host="rabbitmq" \
--amqp-port="5672" \
--amqp-user="guest" \
--amqp-password="guest" \
--amqp-virtualhost="/" \
现在有一些最终的设置任务,这些任务是可选的,但鼓励您快速设置环境
eisenhardt run -d -- n98-magerun2 setup:static-content:deploy eisenhardt run -- n98-magerun2 cache:flush eisenhardt run -- n98-magerun2 setup:di:compile
在此之后,您的 Magento 2 安装应该准备好使用了,但您无法访问它。要这样做,请运行 eisenhardt info
,并复制 webserver
容器的 IP 地址。在您的 hosts 文件中添加一个条目
<ip_address> test-eisenhardt.loc
如果您在浏览器中访问 test-eisenhardt.loc/
,您应该看到主页。使用 magento.admin
和 password123
登录管理。
要查看更多详细信息和可用选项,请参阅其余的文档。
eisenhardt init eisenhardt start eisenhardt info # Edit your /etc/hosts file to point your base URL to the IP address of the webserver # Edit your app/etc/env.php to point your database at `database`. eisenhardt run -- n98-magerun2 db:import <path/to/database.sql>
命令参考
eisenhardt init
初始化一个新的 Eisenhardt 项目或更新现有的项目。
此命令应在您的 Magento 2 安装根目录中运行。
eisenhardt start
启动 Eisenhardt 环境,并使其可用于使用。
此命令在其目录树中搜索 Eisenhardt 环境,因此可以从 Magento 2 安装内的任何目录运行。
选项
eisenhardt info
打印关于 Eisenhardt 环境的一些有用信息。
此命令在其目录树中搜索 Eisenhardt 环境,因此可以从 Magento 2 安装内的任何目录运行。
eisenhardt run
在 Eisenhardt 环境中运行命令。
有许多需要与 Magento 安装集成的管理任务。这包括但不限于
- 运行数据库转储。
- 运行 cron 命令进行调试。
- 通过 Composer 安装依赖项。
您可以通过在 PHP 容器内执行命令来实现此操作,但这并不是最佳做法。这将迫使您在应用容器内安装各种命令行工具。
eisenhardt run
通过创建一个新的容器并将其注入到 Eisenhardt 环境的网络中,并挂载应用服务器上的卷来解决这个问题。然后它运行任意命令,然后删除自身。
使用的容器是 maxbucknell/console
,它具有与应用服务器相同的 PHP 配置。除此之外,它还预装了各种有用的工具,包括
- MySQL 客户端 (
n98-magerun2 db:con
) - Redis 客户端 (
redis-cli -h cache
) - Composer (
composer
) - N98-Magerun2(《n98-magerun2》)
- Git(《git》)
- Curl(《curl》)
- Vim(《vim》)
- PV
- Liquidprompt
- Node.js(带有npm和Yarn)
许多配置也是从主机传递到容器中的。特别是Git配置(包括别名),以及SSH Agent套接字和Composer缓存。
如果您正在运行以标志作为参数的命令,这些标志将由eisenhardt
实用程序解释。为了避免这种情况,您可以引用您的命令,或者将您的命令放在一个--
之后,如下所示
# Prints the Magerun help, not eisenhardt help
eisenhardt run -- n98-magerun2 --help
有关更多详细信息,请参阅该镜像的页面。
选项
eisenhardt fix-permissions
将权限设置为接近正确安装的权限。
所谓正确,我们指的是以下内容
- 所有文件和文件夹都属于主机用户(即您!)
- 所有文件和文件夹都属于组`eisenhardt-www (10118)`
- 所有文件的权限为
744
(rwxr--r--
) - 所有文件夹的权限为
755
(rwxr-xr-x
) - 所有文件夹都被设置为“粘性”,这意味着在其中创建的新文件将继承组和权限设置。
var/
和pub/
对组有写权限。bin/magento
被设置为可执行。
此命令可能需要一段时间才能运行,因为它涉及到很多文件。如果您在Git配置中设置了core.fileMode
为true
,这可能会在您的文件上生成更改。您可以提交这些更改(它们是好的权限,Brent),或者告诉Git不要跟踪权限。
eisenhardt stop
停止Eisenhardt环境,就像您关闭了您的服务器一样。
现有环境的配置
如果您正在使用Eisenhardt设置现有的Magento 2安装,您需要更改的唯一内容是env.php
。
首先在项目根目录中运行eisenhardt init
,然后运行eisenhardt start
。您需要根据入门说明添加主机条目。然后正确设置env.php
参数。
以下env.php
基本上适用于所有Eisenhardt安装。您可以直接复制,或取相关部分。
完成之后,需要导入数据库。首先使用eisenhardt run -- n98-magerun2 db:create
创建数据库,然后使用以下内容从转储中导入:
# path/to/db.sql needs to be within your project root or Docker will not find it.
eisenhardt run -- n98-magerun2 db:import path/to/db.sql
使用eisenhardt run -- n98-magerun2 c:f
进行快速缓存刷新,然后您应该可以继续了。
注意:我们在此处包含队列配置,用于企业消息队列框架。如果您使用的是社区版,则可以删除它,但它可能不会造成任何损害而保留。
<?php return array ( 'backend' => array ( 'frontName' => 'admin', ), 'queue' => array ( 'amqp' => array ( 'host' => 'rabbitmq', 'port' => '5672', 'user' => 'guest', 'password' => 'guest', 'virtualhost' => '/', 'ssl' => '0', ), ), 'db' => array ( 'connection' => array ( 'indexer' => array ( 'host' => 'database', 'dbname' => 'magento2', 'username' => 'root', 'password' => 'root', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8;', 'active' => '1', 'persistent' => NULL, ), 'default' => array ( 'host' => 'database', 'dbname' => 'magento2', 'username' => 'root', 'password' => 'root', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8;', 'active' => '1', ), ), 'table_prefix' => '', ), 'install' => array ( 'date' => 'Thu, 10 Feb 1994 15:12:49 +1200', ), 'crypt' => array ( 'key' => 'd928820f82d3e459641d334a5f1b427e', ), 'session' => array ( 'save' => 'redis', 'redis' => array ( 'host' => 'session', 'port' => '6379', 'password' => '', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '1', 'compression_threshold' => '2048', 'compression_library' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '2592000', ), ), 'resource' => array ( 'default_setup' => array ( 'connection' => 'default', ), ), 'x-frame-options' => 'SAMEORIGIN', 'MAGE_MODE' => 'developer', 'cache_types' => array ( 'config' => 1, 'layout' => 1, 'block_html' => 1, 'collections' => 1, 'reflection' => 1, 'db_ddl' => 1, 'eav' => 1, 'full_page' => 1, 'config_integration' => 1, 'config_integration_api' => 1, 'target_rule' => 1, 'translate' => 1, 'config_webservice' => 1, 'compiled_config' => 1, ), 'cache' => array ( 'frontend' => array ( 'default' => array ( 'backend' => 'Cm_Cache_Backend_Redis', 'backend_options' => array ( 'server' => 'cache', 'port' => '6379', 'persistent' => '', 'database' => 0, 'password' => '', 'force_standalone' => 0, 'connect_retries' => 1, ), ), ), ), 'http_cache_hosts' => array ( 0 => array ( 'host' => 'varnish', 'port' => '6081', ), ), );
常见任务
调试
有两个运行PHP-FPM的应用服务器,它们在很大程度上是相同的。它们之间的区别是其中一个安装了Xdebug。
这两个容器的名称分别是appserver
和appserver_debug
。如果您需要调试,应切换到使用该容器。在大多数情况下不安装Xdebug可以避免与Xdebug相关的性能损失。
切换非常简单。只需发送一个IDE密钥为"docker"
的Xdebug cookie,然后Web服务器将智能路由您的请求。由于其他一切都是共享的,因此此切换是完全透明的。
调试控制台命令
要调试控制台命令,您必须在eisenhardt run
中传递-x
标志。这将运行一个带有Xdebug的容器,并设置相关环境变量以通过IDE密钥"docker"
触发XDebug。
在主机上运行MySQL
在主机上运行MySQL是一个常见的请求。这可能是因为性能原因,或者仅仅是方便。如果您想这样做,您需要将env.php
中的数据库设置替换为以下部分
<?php // ... 'db' => array ( 'connection' => array ( 'indexer' => array ( 'host' => `/sbin/ip route|awk '/default/ { print $3 }'`, 'dbname' => '{DATABASE}', 'username' => '{USER}', 'password' => '{PASSWORD}', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8;', 'active' => '1', 'persistent' => NULL, ), 'default' => array ( 'host' => `/sbin/ip route|awk '/default/ { print $3 }'`, 'dbname' => '{DATABASE}', 'username' => '{USER}', 'password' => '{PASSWORD}', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8;', 'active' => '1', ), ), 'table_prefix' => '', ), // ...
这将根据Docker容器动态设置数据库主机为your
主机IP。
RabbitMQ
RabbitMQ 会在很大程度上自行管理,但问题有时还是会发生。使用的容器包含管理控制台。可以通过访问 /eisenhardt/rabbitmq
并登录来访问它。默认情况下,用户名和密码都设置为 guest
。
邮件
在本地测试邮件是很常见的。Eisenhardt 包含 MailHog,它可以捕获发送到任何电子邮件地址的所有邮件,并在网页界面中显示它们。
可以直接访问 MailHog,但最好的方法是访问您的 Magento 网络服务器上的 /eisenhardt/mail
,这将代理访问。
此外,所有邮件都保存在 .eisenhardt/mail
卷中,作为记录,也是直接检查来源的便捷方式。
技术细节
.eisenhardt
目录
当您运行 eisenhardt init
时,它会在您的 Magento 2 安装根目录下创建一个目录。这个目录包含一些卷、Docker Compose 的各种配置文件和一些服务器配置文件。
建议将此文件夹添加到您的项目中(它包含一个 .gitignore
文件)。这允许团队成员维护一致和共享的开发环境。
虽然可以编辑这些文件(例如,如果您的 MySQL 配置需要调整,因为您有特殊需求),但请注意,通过重新运行 eisenhardt init
更新 Eisenhardt 安装将不会尊重您的更改。
容器清单
Eisenhardt 提供了各种容器,它们都执行不同的功能。以下是完整的列表
varnish_webserver
(nginx:alpine
):您将访问的 web 服务器。负责 SSL 终止并发送到 Varnish。nginx
(nginx:alpine
):PHP 前面的 web 服务器。appserver
(maxbucknell/php:7.0
):通常运行 Magento 的容器。appserver_debug
(maxbucknell/php:7.0-xdebug
):与appserver
相似,但带有 Xdebug。database
(percona:5.6
):数据库。cache
(redis:alpine
):缓存后端。varnis
(maxbucknell/varnish:4
):页面缓存后端。session
(redis:alpine
):会话存储后端。mailhog
(mailhog/mailhog
):捕获邮件的 SMTP 服务器。rabbitmq
(rabbitmq:management-alpine
):消息队列后端。elasticsearch
(elasticsearch:5
):Elastic Search 后端。kibana
(kibana:5
):Elastic Search 的管理后端。
自定义容器
Varnish 和 PHP 是自定义容器。这些在 Docker Hub 上可用,但也包含在 Eisenhardt 的主要仓库中。进入 dockerfiles/
目录,并运行 ./build.sh
。
Docker Compose 文件
Eisenhardt 被分割成许多不同的 YAML 文件。这允许以各种不同的配置启动环境。例如,端口号映射在另一个文件中配置(ports.yml
),因此可以带或不带端口号映射启动环境。
base.yml
:基础 YAML 文件,包含对于生产环境至关重要的服务。这里没有卷存在。dev.yml
:开发所需的服务,包括appserver_debug
和mailhog
。ports.yml
:映射端口:80
、:443
、:3306
(RabbitMQ)、:15672
(Mailhog)和:1080
。
项目名称
Docker Compose 通过 "项目" 分组服务。项目通常是由单个 docker-compose up
调用启动的一组服务。项目需要一个名称,可以通过 -p
参数指定,但默认情况下将根据包含 *.yml
文件的目录名称生成。
Eisenhardt 根据 Magento 项目的目录名称设置其项目的自定义名称。如果让其自行处理,Docker Compose 将每次都将其项目命名为 "eisenhardt",因为 YAML 文件就存储在那里。
权限
默认情况下,Docker以root用户运行。这是可以的,因为这通常意味着它可以做它需要做的任何事情。当你处理由Docker容器生成的文件时,无论是提交还是删除,就会出现问题。
一个简单的 rm -rf pub/static
就会变得有问题。
因此,Eisenhardt的所有服务器都被配置为以非特权用户运行。对于Eisenhardt来说,实际的用户ID并不重要,因为所有文件都应该属于你的主机用户。Eisenhardt使用组权限来完成其任务。
Nginx以其典型的用户 nginx:nginx
运行。这个用户没有修改任何文件的能力,但所有文件都应该设置为世界可读。
PHP以自定义用户 eisenhardt-www:eisenhardt-www
(10118:10118
) 运行。这是一个自定义用户(为了统一Alpine和Debian之间的UID)。所有文件的组应该设置为这个,因为 pub/
和 var/
被设置为组可写。PHP只对其他所有文件有读取权限,因为那就是它需要的。
其他服务不与文件级别的Magento 2安装进行交互,所以它们的凭证不太重要。
当运行 eisenhardt run
时,会创建一个Docker容器。你的主机 /etc/passwd
被映射到容器中,并且它被配置为以你的用户ID运行。这意味着运行类似 eisenhardt run -- whoami
的命令将返回你的用户名。然而,我们还设置了容器内的用户为主组 10118
或 eisenhardt-www
。这意味着所有在 eisenhardt run
调用中创建的文件将保持一致的权限。
Eisenhardt附带一个命令 eisenhardt fix-permissions
,用于设置上述描述的权限。按照这种模式通常不会出现权限问题。