【问题标题】:How to automate docker to run script within container and notify completion to host?如何自动化 docker 在容器内运行脚本并通知主机完成?
【发布时间】:2018-08-14 07:10:10
【问题描述】:

我想通过以下步骤自动化我的应用程序的构建过程:

  1. 启动我的 build-system 容器,该容器包含用于制作我的应用程序的最终 exe 的所有依赖项和脚本。
  2. 在构建系统容器中触发一个 bash 脚本来启动构建过程。
  3. 构建完成后,使用 docker cp 或在启动容器时附加卷将 exe 传输到主机。
  4. 将 exe 转移到新的 dist-system 容器中,该容器本质上是将存储在 Docker hub 中的最终映像。
  5. 在 dist 系统中安装应用程序,通过在该容器中触发另一个 bash 脚本进行自定义配置。
  6. 当第 5 步完成后,返回主机并运行 dist-system 容器的 docker commit,然后从主机运行 docker push 映像到 Docker 集线器。

我的问题具体涉及第 3 点和第 6 点,我需要知道 bash 脚本已在容器中完成执行。只有这样我才想在主机中触发 docker 命令。有没有办法通知 docker 在容器内执行 bash 脚本?

【问题讨论】:

  • 整个序列听起来像是一个非常典型的两阶段docker build,你应该研究它是如何工作的。你可能永远不应该直接使用docker commit(尽管这个序列比大多数序列都好)。 docker exec 也不打算成为在 Docker 中做事的核心路径。

标签: bash docker docker-compose dockerfile


【解决方案1】:

docker run 是同步的,默认情况下会阻塞,直到 docker 容器退出。

例如,如果build-system Dockerfile 看起来像这样:

FROM alpine:latest

COPY ./build.sh /build.sh

VOLUME /data

CMD ["/build.sh", "/data/test.out"]

build.sh如下:

#!/bin/sh

sleep 5
echo "Hello world!" >> "$1"
exit 0 # docker run will exit with this code, you can use this to check if your build was successful

运行 docker run --rm -v /your/work/directory/build-output:/data build-system 将等待 5 秒然后退出,/your/work/directory/build-output/test.out 将被创建。

【讨论】:

  • docker build 也是同步的。
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2016-02-06
相关资源
最近更新 更多