【问题标题】:How to execute docker commands after a process has started进程启动后如何执行 docker 命令
【发布时间】:2017-09-13 14:39:04
【问题描述】:

我为服务编写了一个 Dockerfile(我有一个指向启动进程的脚本的 CMD),但是在进程启动后我无法运行任何其他命令?我尝试使用“&”在后台运行该进程,以便在该进程启动后运行其他命令但它不起作用?关于如何实现这一点的任何想法?

例如,假设我启动了一个数据库服务器,并且想在数据库进程启动后才运行一些脚本,我该怎么做?

编辑 1:

我的具体用例是我将 Rabbitmq 服务器作为服务运行,我想创建一个新用户,让他成为管理员,并在服务在容器中启动后删除默认的来宾用户。我可以通过登录到 docker 容器手动执行此操作,但我想通过将这些附加到启动 rabbitmq 服务的 shell 脚本来自动化它,但这不起作用。

感谢任何帮助!

问候

【问题讨论】:

  • 如果你想运行一个数据库服务器,我建议你将它作为一个单独的容器运行。
  • 如果你想沿着第一个进程运行另一个进程,& 应该可以工作。我曾经编写一个脚本,在 mysql 日志上使用 catgrep,一旦我需要一个快速而肮脏的解决方案,就会寻找“成功启动”。
  • 你试过RUN 吗?
  • 我并不是特指数据库服务器,而是举个例子。 RUN 可用于在创建 docker 映像时运行,但我希望我的命令仅在容器和服务启动后运行,因为我的命令需要服务启动并运行。我知道的一种方法是使用 & 并将其作为 shell 脚本中的后台进程运行,但这不起作用,不知道为什么。还有其他方法吗?
  • 更新了我在使用 Rabbitmq 时遇到的问题

标签: docker docker-compose dockerfile microservices consul


【解决方案1】:

特别是围绕 Rabbit MQ 的问题 - 您可以创建一个 rabbitmq.config 文件并在创建 docker 映像时将其复制。

在该文件中,您可以指定在从头开始设置数据库时将创建的 default_userdefault_pass,请参阅 https://www.rabbitmq.com/configure.html

对于一般问题 - 您可以将入口点更改为运行您需要的任何内容和所需服务的脚本,而不是服务的运行脚本

【讨论】:

  • 谢谢!我认为这是个好主意,我会为 Rabbit MQ 实现它。
【解决方案2】:

我部分理解了你的问题。根据我从您的问题中了解到的情况,我建议您提及 Copy 命令以将要运行的脚本复制到 dockerfile 中。构建映像并运行容器后,启动 db 服务。然后执行容器并进入容器,手动运行脚本。

如果你在 dockerfile 中有 CMD 命令,那么它将被你在执行期间指定的命令覆盖。所以,我认为你没有其他选项来运行脚本,除非你的 dockerfile 中没有 CMD。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多