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

Docker编写并执行启动容器的命令,docker,boot2docker,Docker,Boot2docker,我正试图了解docker compose中的命令选项。在我当前的docker-compose.yml中,我启动prosody docker image(),并希望在容器实际启动时创建一个用户列表 容器的文档说明可以使用环境选项本地、域和密码创建用户,但这是单个用户。我需要一个用户列表 当在互联网上阅读一些东西时,似乎使用命令选项我应该能够在启动或运行的容器中执行命令 xmpp: image: prosody/prosody command: prosodyctl register

我正试图了解docker compose中的命令选项。在我当前的docker-compose.yml中,我启动prosody docker image(),并希望在容器实际启动时创建一个用户列表

容器的文档说明可以使用环境选项
本地、域和密码创建用户,但这是单个用户。我需要一个用户列表

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

xmpp:
    image: prosody/prosody
    command: prosodyctl register testuser localhost testpassword
    ports:
        - "5222:5222"
        - "127.0.0.1:5347:5347"
但这似乎不起作用,我使用
docker exec-it bash检查了正在运行的容器,但没有创建用户


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

命令
指令与在
docker run
命令结束时传递的指令完全相同,例如
echo“hello world”

docker run debian echo "hello world"
该命令被解释为图像的
入口点
的参数,在debian的例子中是
/bin/bash
。对于您的图像,它会传递给。查看该脚本,您的命令将被传递到shell。我希望您传递的任何命令都能成功运行,但一旦您的命令完成,容器将退出。请注意,Dockerfile中的默认命令设置为
CMD[“prosodyctl”,“start”]
,这可能是一个启动服务器的长时间运行的进程

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

volumes:
  - my_prosodoy_config:/etc/prosody
对于docker compose文件,其中
my_prosody\u 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
来添加用户。但这取决于韵律和图像的行为。

CMD
与Docker中的
入口点直接相关(有关解释,请参见问题)。因此,在更改其中一个时,您还必须检查这对另一个的影响。如果查看,您将看到默认命令是通过
CMD[“prosodyctl”,“start”]
启动韵律。正如Adrian提到的,只需传递这个命令。但是,您的命令会覆盖默认命令,因此您的韵律恶魔永远不会启动。也许你想试试像这样的东西

xmpp:
    image: prosody/prosody
    command: sh -c prosodyctl register testuser localhost testpassword && prosodyctl start
    ports:
        - "5222:5222"
        - "127.0.0.1:5347:5347"
xmpp:
    image: prosody/prosody
    environment:
        - LOCAL=testuser
        - DOMAIN=localhost
        - PASSWORD=testpassword
    ports:
        - "5222:5222"
        - "127.0.0.1:5347:5347"
相反。更优雅,而且不知何故,创造者似乎有意(从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"
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\u container\u name
是正在运行的容器的名称(使用
docker ps
列出正在运行的容器)。

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