Docker在启动容器上编写并执行命令

时间:2015-05-01 06:03:29

标签: docker boot2docker

我试图了解docker compose中的COMMAND选项。在我当前的docker-compose.yml中,我启动了韵律泊坞窗映像(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在已启动的容器上执行命令,还是有其他选项?

2 个答案:

答案 0 :(得分:1)

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

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来添加用户。但这取决于韵律和图像的表现。

答案 1 :(得分:1)

CMD与Docker中的ENTRYPOINT直接相关(有关解释,请参阅this问题)。因此,当更改其中一个时,您还必须检查这对另一个的影响。如果您查看Dockerfile,您会看到默认命令是通过CMD ["prosodyctl", "start"]启动韵律。正如阿德里安所说,entrypoint.sh只是通过了这个命令。但是,您的命令会覆盖默认命令,因此您的韵律恶魔永远不会启动。也许你想尝试像

这样的东西
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列出正在运行的容器)。

相关问题