我正在尝试自动在Docker容器中安装Drupal网站。
这是我的docker-compose文件:
version: '2'
services:
mariadb:
image: mariadb
environment:
MYSQL_DATABASE: drupal8
MYSQL_USER: drupal8
MYSQL_PASSWORD: drupal8
MYSQL_ROOT_PASSWORD: drupal8
restart: always
drupal:
image: drupal
build:
drupal_init
ports:
- 8888:80
depends_on:
- mariadb
这是我在drupal_init中的Dockerfile:
FROM drupal
RUN apt-get update -y && apt-get install -y wget vim git mysql-client
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
php composer-setup.php && \
mv composer.phar /usr/local/bin/composer && \
php -r "unlink('composer-setup.php');"
RUN wget -O drush.phar https://github.com/drush-ops/drush-launcher/releases/download/0.4.2/drush.phar && \
chmod +x drush.phar && \
mv drush.phar /usr/local/bin/drush
RUN rm -rf /var/www/html/*
RUN mkdir -p /var/www/html/web
RUN composer -vvv create-project drupal-composer/drupal-project /var/www/html/web --stability dev --no-interaction
RUN drush si -y \
--db-url=mysql://root:drupal8@mariadb/drupal8 \
--site-name=drupal8 \
[email protected] \
[email protected] \
--account-name=drupal8 \
--account-pass=drupal8
一切正常,直到我了解drush
创建数据库表的命令。我遇到了错误
[error] Failed to create database: ERROR 2005 (HY000): Unknown MySQL server host 'mariadb' (-2)
但是-如果我注释掉RUN drush...
Dockerfile的一部分,则容器的创建确实成功(显然没有创建表)。然后docker exec -it <containerID> bash
,我可以发出,进入容器并成功发出相同的命令。
$ docker exec -it d16e bash
root@d16e4ff4dda6:/var/www/html/web# drush si -y \
> --db-url=mysql://root:drupal8@mariadb/drupal8 \
> --site-name=drupal8 \
> [email protected] \
> [email protected] \
> --account-name=drupal8 \
> --account-pass=drupal8
// You are about to DROP all tables in your 'drupal8' database. Do you want to continue?: yes.
[notice] Starting Drupal installation. This takes a while.
[success] Installation complete.
那么为什么会这样呢?在我的drupal服务启动时,mariadb服务似乎未处于活动状态。不过,在我的docker-compose文件中,我有drupal服务depends_on
mariadb服务,因此mariadb是否可用于drupal?
从理论上讲,我可以将其拆分为两个不同的Docker文件,然后通过shell脚本将它们旋转起来,但这将无法实现使用docker-compose方法的目的。关于docker-compose我做错了什么的任何线索?
您的drupal
容器mariadb
在构建期间对容器一无所知。只有在您运行docker-compose up
的drupal
和mariadb
集装箱将可为对方在同一个网络上。
您需要做的是使用drush
启动容器后运行docker-compose up
。您可以bash
用来完成该任务。例如,创建start.bash
文件并放入:
#!/usr/bin/env bash
docker-compose up -d
# You might need to put some delay here: sleep 5
docker exec -it <your-drupal-container> drush si -y \
--db-url=mysql://root:drupal8@mariadb/drupal8 \
--site-name=drupal8 \
[email protected] \
[email protected] \
--account-name=drupal8 \
--account-pass=drupal8
更新:您可能还面临的问题是启动数据库实例需要一些时间。因此,即使您在运行drush
后立即运行该命令,docker-compose up
它仍然可能会失败。为了解决这个问题,您可以使用Docker Compose healthcheck或在运行drush
命令之前简单地进行显式等待(请参见上面的示例)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句