【问题标题】:How to define a docker cli service in docker-compose如何在 docker-compose 中定义 docker cli 服务
【发布时间】:2019-03-18 10:30:18
【问题描述】:

我有一个运行一些服务的 docker-compose 文件。

services:

  cli:
    build:
      context: .
      dockerfile: docker/cli/Dockerfile

    volumes:
      - ./drupal8site:/var/www/html/drupal8site


  drupal:
    container_name: drupal
    build:
      context: .
      dockerfile: docker/DockerFile.drupal
      args:
        DOC_ROOT: /var/www/html/drupal8site
    ports:
      - 80:80
    volumes:
      - ./drupal8site:/var/www/html/drupal8site
    restart: always
    environment:
      APACHE_DOCUMENT_ROOT: /var/www/html/drupal8site/web    

  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root

我想添加另一个服务,它是一个容器,我可以在其中运行 CLI 命令(composer、drush for drupal、php 等)。

以下 Dockerfile 是我最初定义 cli 服务的方式,但它在运行后立即停止。如何定义它,使它成为我的 docker-compose 的一部分,共享我安装的卷,并且我可以交互地连接到它并在其上运行 CLI 命令?

FROM php:7.2-cli

#various programs
RUN apt-get update \
    && apt-get install vim --assume-yes \
    && apt-get install git --assume-yes \
    && apt-get install mysql-client --assume-yes


CMD ["bash"]

谢谢, 亚龙

【问题讨论】:

  • 你 cli 的目的是什么:执行针对 mysql 和 drupal 的查询(通过命令行),或者拥有一个容器,该容器还将存储一些额外的功能,这些功能将使用以前的服务?你的 CMD 在这里用 bash 不能工作,因为它不是交互式的......但在我继续之前,请回答第一个问题
  • 我怀疑我的 CMD 错误。我只是不知道我是否应该放一个CMD。 CLI 容器的目的是运行各种命令:composer 需要安装卷上的包,该数据库中的 sqldump,清除 drupal 缓存等。我的问题是如何定义一个不需要在其中运行进程的容器背景,但我以交互方式使用,但被定义为我的 docker-compose 文件的一部分。

标签: docker docker-compose


【解决方案1】:

如果你想在 docker 镜像上运行自动化脚本,这显然是一个 ci-pipeline 的工作。您可以使用 CloudFoundry 或 OpenStack 来执行此操作。

但是这篇文章还有很多其他问题:

1.) 我如何共享我安装的卷:

您可以使用 -v 选项将卷传递给容器。例如:

docker run -it -d -v $(pwd)/localFolder:/exposedFolderFromDocker mydockerhub/myawesomeimage

2.) 我能否以交互方式连接到它并在其上运行 CLI 命令

docker exec -it docker_cli_1 bash

我建议将 docker-image 的功能实现到单个 docker-images Dockerfile。例如复制和运行一个准备好的 shell 脚本:

# your Dockerfile
FROM php:7.2-cli

#various programs
RUN apt-get update \
    && apt-get install vim --assume-yes \
    && apt-get install git --assume-yes \
    && apt-get install mysql-client --assume-yes

# individual changes
    COPY your_script.sh /
    RUN  chown root:root /your_script.sh && \
         chmod 0755 /your_script.sh
    CMD ["/your_script.sh"]

# a folder to expose
VOLUME /exposedFolderFromDocker

CMD ["bash"]

【讨论】:

  • 感谢您的回答。我会澄清我的问题 - 我的 docker-compose 适用于所有服务。我只是想添加一个图像来运行 CLI 命令。我不明白它是否应该成为 docker-compose 的一部分 - 如果是的话 - 它应该运行什么 CMD?因为我想将它用作交互式外壳(所有服务都在运行非交互式进程)
  • 'docker exec -it docker_cli_1 bash' 将为您的 cli 服务提供一个终端。您可以扩展 Dockerfile 以添加东西,而不是使用控制台手动安装东西(更改 docker 映像),例如就像我描述的那样。
  • CMD ["bash"] 使 docker-image 提供一个终端以通过 'docker exec -it docker_cli_1 bash' 进行连接。您正在尝试做的是 Dockerfile 的一部分,并且不能在 docker-compose.yml 中进行配置,据我所知 ;)
  • 但 'docker exec -it docker_cli_1 bash' 仅在容器运行时才有效。在我的情况下,它没有运行,因为它没有正在运行的进程——它是一个 CLI 服务。所以这又是我的问题——我想要一个用于运行 CLI 命令的图像——它应该如何定义和运行? (如果它是 docker-compose 的一部分,那么它应该运行什么 CMD,如果有的话?)
  • 你可以用 docker run -it 代替 docker exec。这将满足您的需要,但对于非运行容器。您还可以将查询封装在 shell 函数中(在您的 .bashrc / .profile 中),例如 function dosomething () { (docker run -ti --rm -v ${HOME}:/root -v $(pwd): /git docker-cli_bash "$@") }, 用 dosomething --with --extra 参数调用它
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2019-04-02
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多