Docker在启动容器时编写和执行命令

我试图让我的头在Docker撰写COMMAND选项。 在我当前的docker-compose.yml中,我启动了语义docker图像( https://github.com/prosody/prosody-docker ),我想在容器实际启动时创build一个用户列表。

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

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

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

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

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

COMMAND指令与docker run命令结束时的指令完全相同,例如echo "hello world"

 docker run debian echo "hello world" 

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

我不确定Prosody是如何工作的(或者甚至是什么),但是我想你可能想要在保存你的用户的configuration文件中映射,或者设置一个数据容器来保存你的configuration。 第一个解决scheme意味着要添加如下内容:

 volumes: - my_prosodoy_config:/etc/prosody 

my_prosody_config -compose文件中, my_prosody_config是保存configuration文件的目录。

第二个解决scheme可能涉及首先创build一个数据容器,如:

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

(回声应该完成,留给你一个停止的容器,这个容器已经为configuration和日志设置了卷,只要确保你不要错误地装载这个容器!)

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

 volumes_from: - prosody-data 

希望你可以通过像以前那样运行prosodyctl register docker exec来添加用户,然后在命令行运行prosodyctl register 。 但这取决于韵律和图像的performance。

CMD与Docker中的ENTRYPOINT直接相关(请参阅此问题以获得解释)。 所以当改变其中一个时,你也必须检查这是如何影响另一个。 如果你看Dockerfile ,你会看到默认命令是通过CMD ["prosodyctl", "start"]开始韵律。 正如Adrian所说, 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列出正在运行的容器)。