【问题标题】:Docker Compose and execute command on starting containerDocker Compose 并在启动容器时执行命令
【发布时间】:2015-05-01 06:03:28
【问题描述】:

我试图了解 docker compose 中的 COMMAND 选项。在我当前的 docker-compose.yml 中,我启动了韵律 docker 映像 (https://github.com/prosody/prosody-docker),并且我想在容器实际启动时创建一个用户列表。

容器的文档指出,可以使用环境选项LOCAL, DOMAIN, and PASSWORD 来创建用户,但这是单个用户。我需要一个用户列表。

当在互联网上阅读一些东西时,似乎使用命令选项我应该能够在启动或运行的容器中执行命令。

xmpp:
    image: prosody/prosody
    command: prosodyctl register testuser localhost testpassword
    ports:
        - "5222:5222"
        - "127.0.0.1:5347:5347"

但这似乎不起作用,我使用 docker exec -it <imageid> bash 检查运行容器,但未创建用户。

是否可以使用 docker-compose 在已启动的容器上执行命令或是否有其他选项?

【问题讨论】:

  • 命令选项覆盖来自 docker 容器的默认命令,因此它不能用于您想要的。也许您可以创建一个脚本,首先使用docker-compose start 启动您的环境,然后使用docker exec <your container id> prosodyctl register ... 在该容器中创建用户?

标签: docker boot2docker


【解决方案1】:

COMMAND 指令与docker run 命令末尾传递的指令完全相同,例如echo "hello world" in:

docker run debian echo "hello world"

该命令被解释为图像的ENTRYPOINT 的参数,在debian 的情况下为/bin/bash。对于您的图像,它被传递给this script。查看该脚本,您的命令将被传递给 shell。我本来希望您传递的任何命令都能成功运行,但是一旦您的命令完成,容器就会退出。请注意,Dockerfile 中的默认命令设置为CMD ["prosodyctl", "start"],这可能是一个启动服务器的长时间运行的进程。

我不确定 Prosody 的工作原理(甚至它是什么),但我认为您可能想要映射到包含用户的配置文件中,或者设置一个数据容器来保存您的配置。第一个解决方案意味着添加如下内容:

volumes:
  - my_prosodoy_config:/etc/prosody

到 docker-compose 文件,其中my_prosody_config 是保存配置文件的目录。

第二种解决方案可能涉及首先创建一个数据容器,例如:

docker run -v /etc/prosody -v /var/log/prosody --name prosody-data prosody-docker echo "Prosody Data Container"

(回显应该完成,给您留下一个停止的容器,该容器为配置和日志设置了卷。请确保您不会意外docker rm此容器!)

然后在docker-compose文件中添加:

volumes_from:
   - prosody-data

希望您可以像以前一样运行docker exec 添加用户,然后在命令行运行prosodyctl register。但这取决于韵律和图像的表现。

【讨论】:

    【解决方案2】:

    CMD 与 Docker 中的ENTRYPOINT 直接相关(请参阅this 问题以获得解释)。因此,在更改其中一个时,您还必须检查这对另一个有何影响。如果您查看Dockerfile,您会看到默认命令是通过CMD ["prosodyctl", "start"] 启动韵律。 entrypoint.sh 就像 Adrian 提到的那样传递这个命令。但是,您的命令会覆盖默认命令,因此您的韵律恶魔永远不会启动。也许你想尝试类似的东西

    xmpp:
        image: prosody/prosody
        command: sh -c prosodyctl register testuser localhost testpassword && prosodyctl start
        ports:
            - "5222:5222"
            - "127.0.0.1:5347:5347"
    

    相反。更优雅,并且以某种方式创建者似乎想要的(从 entrypoint.sh 脚本判断)类似于

    xmpp:
        image: prosody/prosody
        environment:
            - LOCAL=testuser
            - DOMAIN=localhost
            - PASSWORD=testpassword
        ports:
            - "5222:5222"
            - "127.0.0.1:5347:5347"
    

    回答你的最后一个问题:不,(到目前为止)不可能通过 docker-compose 在正在运行的容器上执行命令。但是,您可以使用 docker 轻松完成此操作:

    docker exec -i prosody_container_name prosodyctl register testuser localhost testpassword
    

    其中prosody_container_name 是您正在运行的容器的名称(使用docker ps 列出正在运行的容器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2023-01-28
      • 2019-10-22
      • 1970-01-01
      • 2021-11-29
      • 2018-04-10
      相关资源
      最近更新 更多