gpt4 book ai didi

docker - 链接 Docker 镜像并按顺序执行

转载 作者:行者123 更新时间:2023-12-02 18:12:34 26 4
gpt4 key购买 nike

我正在使用我自己的镜像扩展 APIMan/Wildfly Docker 镜像,这将做两件事:

1) Drop my .war file application into the Wildfly standalone/deployments directory

2) Execute a series of cURL commands that would query the Wildfly server in order to configure APIMan.

最初,我尝试创建两个 Docker 镜像(第一个放入 .war 文件,第二个用于执行 cURL 命令),但是我错误地认为最里面镜像中的 CMD 指令将首先执行,而 CMD 指令将首先执行。向外执行。

例如:

ImageA:
FROM jboss/apiman-wildfly:1.1.6.Final
RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent
COPY /RatedRestfulServer/target/RatedRestfulServer-1.0-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/

CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]

还有

ImageB:
FROM ImageA
COPY /configure.sh /opt/jboss/wildfly/

CMD ["/opt/jboss/wildfly/configure.sh"]

我最初假设在运行时 Wildfly/APIMAN 将首先启动(根据 ImageA CMD 指令),然后运行我的自定义脚本(根据 ImageB CMD 指令)。我假设这是不正确的,因为在整个层次结构中,仅执行 1 个 CMD 指令(链中最外层 Dockerfile 中的最后一个指令)?

然后,我尝试将所有内容合并到 1 个 Dockerfile 中,该文件将(在构建过程中)启动 Wildfly/APIMAN,运行 cURL 命令,关闭 Wildfly 服务器,然后 CMD 命令将在运行时和 Wildfly 期间启动它/APIMan 将被配置。然而,这不起作用,因为当我启动 Wildfly(作为构建的一部分)时,它控制控制台并等待日志消息显示,因此构建永远不会完成。如果我在 RUN 命令末尾附加“&”,它不会运行 ( Dockerfile : RUN results in a No op )。

这是我这次尝试的 Dockerfile:

FROM jboss/apiman-wildfly:1.1.6.Final
RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent
COPY /RatedRestfulServer/target/RatedRestfulServer-1.0-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/
COPY /configure.sh /opt/jboss/wildfly/
RUN /opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 -c standalone-apiman.xml
RUN /opt/jboss/wildfly/configure.sh
RUN /opt/jboss/wildfly/bin/jboss-cli.sh --connect controller=127.0.0.1 command=:shutdown

CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]

有什么解决办法吗?我试图在 Wildfly/APIMan 启动后运行我的“configure.sh”脚本。对于我来说,这是在构建过程中还是在运行时完成并不重要,但是我没有看到任何方法可以在构建过程中执行此操作,因为 Wildfly 没有守护程序模式。

最佳答案

only 1 CMD instruction is executed (the last one in the outermost Dockerfile within the chain)?

是的,这是正确的,请记住,CMD 不是在构建时运行,而是在实例化时运行。本质上,当您从 ImageB

实例化容器时,您在第二个 Dockerfile 的 CMD 中所做的操作会覆盖第一个 Dockerfile

如果您正在执行某种 Rest API 或 cli 或 cURL 来连接到您的 Wildfly 服务器,我建议您在容器实例化之后而不是在容器构建之后进行该配置。这样:

CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]`

始终是您的最后一个命令。如果您需要一些额外的文件或对配置文件进行更改,可以将它们放入 Dockerfile 中,以便在实例化时调用 CMD 之前在构建时复制它们。

总结一下:

1) 使用此 Dockerfile 构建 Docker 容器(docker 构建):

FROM jboss/apiman-wildfly:1.1.6.Final
RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent
COPY /RatedRestfulServer/target/RatedRestfulServer-1.0-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/
COPY /configure.sh /opt/jboss/wildfly/
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]

2) 运行(从新创建的镜像实例化您的容器)

docker run <image-id>

3) 从容器或以相同方式配置 Wildfly 的主机运行以下命令。假设您正在使用一些 Rest API 来配置事物(即使用 cURL):

/opt/jboss/wildfly/configure.sh

您可以实例化第二个容器来运行此命令,如下所示:

docker run -ti <image-id> /bin/bash

关于docker - 链接 Docker 镜像并按顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com