如何在docker compose中定义docker cli服务

如何在docker compose中定义docker cli服务,docker,docker-compose,Docker,Docker Compose,我有一个docker compose文件,它运行一些服务 services: cli: build: context: . dockerfile: docker/cli/Dockerfile volumes: - ./drupal8site:/var/www/html/drupal8site drupal: container_name: drupal build: context: .

我有一个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"]
谢谢,
Yaron

如果您想在docker映像上运行自动脚本,这显然是ci管道的工作。您可以使用CloudFoundry或OpenStack来实现这一点

但在这篇文章中还有许多其他问题:

1.)如何共享已装入的卷:

可以使用-v选项将卷传递给容器。e、 g:

docker run -it -d -v $(pwd)/localFolder:/exposedFolderFromDocker mydockerhub/myawesomeimage
2.)我能否以交互方式连接到它并在其上运行CLI命令

docker exec -it docker_cli_1 bash
我建议将docker映像的功能实现到单个docker映像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?因为我想将其用作交互式shell(所有服务都运行一个非交互式进程)'docker exec-it docker_cli_1 bash'将为您的cli服务提供一个终端。不必使用控制台手动安装(更改docker映像),您可以扩展docker文件以添加内容,例如,通过我在上所述的方式。CMD[“bash”]使docker映像提供通过“docker exec-it docker_cli_1 bash”连接的终端。您尝试执行的操作是Dockerfile的一部分,无法在docker-compose.yml中配置,我知道;)但是“docker exec-it docker\u cli\u 1 bash”仅在容器正在运行时才起作用。在我的例子中,它没有运行,因为它没有正在运行的进程-它是一个CLI服务。这也是我的问题——我想要一个运行CLI命令的映像——应该如何定义和运行它?(如果它是docker compose的一部分,那么它应该运行什么CMD,如果有的话?)。这将满足您的需要,但对于非运行的容器。您还可以将查询封装在shell函数中(在.bashrc/.profile中),例如函数dosomething(){(docker run-ti--rm-v${HOME}:/root-v$(pwd):/git docker-cli_bash“$@”)},使用dosomething调用它--使用--额外参数cli的目的是:执行查询(通过命令行)是以mysql和drupal为目标,还是有一个容器,它还将存储一些额外的功能,这些功能将使用之前的两个服务?您的CMD在这里与bash无法工作,因为它不是交互式的。。。但在我继续之前,请回答第一个问题,我怀疑我的CMD是错误的。我只是不知道我是否应该写一个命令。CLI容器的用途是运行各种命令:composer require用于装载卷上的包、来自该数据库的sqldump、清除drupal缓存等。我的问题是如何定义一个容器,该容器不需要在后台运行进程,但我以交互方式使用,但它被定义为docker compose文件的一部分。