Docker-compose依赖项似乎不起作用

时间:2018-04-17 20:28:05

标签: docker docker-compose dockerfile

我试图在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 \
  --site-mail=drupal8@foo.com \
  --account-mail=drupal8@foo.com \
  --account-name=drupal8 \
  --account-pass=drupal8

在我使用drush命令创建数据库表之前,一切正常。我遇到了错误

[error]  Failed to create database: ERROR 2005 (HY000): Unknown MySQL server host 'mariadb' (-2)  

但是 - 如果我注释掉Dockerfile的RUN drush...部分,容器就会成功创建(显然没有创建表)。然后,我可以发出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 \
>   --site-mail=drupal8@foo.com \
>   --account-mail=drupal8@foo.com \
>   --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文件中,我已经获得了drrial服务depends_on mariadb服务,所以不应该为drupal提供mariadb吗?

理论上,我可以把它分成两个不同的Docker文件,并通过shell脚本将它们分解,但这会破坏使用docker-compose方法的目的。关于我对docker-compose做错了什么的线索?

2 个答案:

答案 0 :(得分:2)

您错误地了解容器内的命令何时运行:它们在构建映像时运行,并且在服务启动之前构建映像。

启动容器时需要运行命令drush ...。这可以通过将其置于RUN内来完成,但也必须运行默认命令(drupal图像中的命令,实际上是来自php-apache图像的命令, CMD ["apache2-foreground"])。因此,您需要将两个命令合并为一个。一种方法是创建一个包含两个命令的boot-script.sh(并将其放在图像中):

#!/bin/sh
drush si -y \ --db-url=mysql://root:drupal8@mariadb/drupal8 \
 --site-name=drupal8 \
 --site-mail=drupal8@foo.com \
 --account-mail=drupal8@foo.com \
 --account-name=drupal8 \
 --account-pass=drupal8

apache2-foreground

然后替换图片中的CMD

CMD /path/to/script/inside/container/boot-script.sh

答案 1 :(得分:1)

您的drupal容器在构建过程中对mariadb容器一无所知。只有在您运行docker-compose up后,drupalmariadb容器才能在同一网络上互相使用。

您需要做的是在使用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 \
   --site-mail=drupal8@foo.com \
   --account-mail=drupal8@foo.com \
   --account-name=drupal8 \
   --account-pass=drupal8

<强>更新 您可能还面临的问题是,启动数据库实例需要一些时间。因此,即使您在运行drush后立即运行docker-compose up命令,它仍可能会失败。要解决此问题,您可以使用Docker Compose healthcheck或在运行drush命令之前简单地进行显式等待(参见上面的示例)。