我试图了解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在已启动的容器上执行命令,还是有其他选项?
答案 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
列出正在运行的容器)。