Docker-compose 依赖似乎不起作用

标签 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)  

但是 - 如果我注释掉 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 \
>   --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 文件中,我有 drupal 服务 depends_on mariadb 服务,那么 mariadb 不应该对 drupal 可用吗?

理论上我可以将其分成两个不同的 Docker 文件,并通过 shell 脚本启动它们,但这会违背使用 docker-compose 方法的目的。关于我在 docker-compose 上做错了什么有什么线索吗?

最佳答案

您误解了容器内的命令何时运行:它们是在构建镜像时运行的,而镜像是在服务启动之前构建的。

容器启动时需要运行命令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

关于Docker-compose 依赖似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49886933/

相关文章:

spring-boot - 连接被拒绝 : While Running the Docker Compose

docker - 是否可以创建一个使用另一个文件并修改其中一些设置的docker-compose.yml文件?

postgresql - 如何在 Postgres Docker 容器中创建数据库?

typescript - 尝试在Dockerfile中编译TypeScript文件失败

reactjs - React SPA动态环境配置

docker - 为Mesh/Docker激活SSL

bash - 我无法使用基于 ubuntu 的镜像部署 Docker Swarm 服务

docker - 无法使用 docker-compose 设置 OrientDB 的 root 密码

python - 从父目录构建 Dockerfile

Dockerfile - 用于切换主目录的 Docker 指令