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

Mar*_*rco 6 docker boot2docker

我试图了解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"
Run Code Online (Sandbox Code Playgroud)

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

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

Adr*_*uat 1

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

docker run debian echo "hello world"
Run Code Online (Sandbox Code Playgroud)

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

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

volumes:
  - my_prosodoy_config:/etc/prosody
Run Code Online (Sandbox Code Playgroud)

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

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

docker run -v /etc/prosody -v /var/log/prosody --name prosody-data prosody-docker echo "Prosody Data Container"
Run Code Online (Sandbox Code Playgroud)

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

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

volumes_from:
   - prosody-data
Run Code Online (Sandbox Code Playgroud)

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