【问题标题】:How to wait for a command to finish executing inside a container如何等待命令在容器内完成执行
【发布时间】:2018-07-06 17:09:56
【问题描述】:

使用以下 dockerfile:

FROM golang:1.9 AS build-go
RUN go get github.com/grafana/grafana; exit 0
WORKDIR $GOPATH/src/github.com/grafana/grafana
RUN go run build.go setup
RUN go run build.go build

FROM node:8 AS build-node
COPY --from=build-go $HOME/go/src/github.com/grafana/grafana .
RUN npm install -g yarn
RUN yarn install --pure-lockfile
CMD npm run watch
EXPOSE 3000

我创建了一个镜像,然后通过 bash 文件来启动一个容器:

docker run -d -P --name=grafanabuildfromsrc myimg
docker exec grafanabuildfromsrc ./bin/linux-amd64/grafana-server

./bin/linux-amd64/grafana-server 需要npm run build 一次完成所有文件的构建。当前脚本将在构建完成之前执行它。

我想要的是,在执行 bash 文件中的第二个命令之前,它应该等待容器内的命令首先完成。这可能吗?

一个可能很重要的提示:grafana-servernpm run watch 未完成时表示"Failed to detect generated javascript files in public/build

我如何做到这一点?

【问题讨论】:

  • 以我有限的经验,运行一个 Docker 镜像然后立即尝试docker exec 里面的东西充其量是不可靠的。也许我应该再试一次。你可以先做一个简单的docker run -P --name whatever someimage sh -c 'sleep 3600'; docker exec whatever sh -c 'echo success' 吗?
  • 我也同意docker exec 不是您正在寻找的工具。事实上,由于 Docker 映像的内容是静态的,因此在文件系统更改时重建的“监视”类型操作可能也不是您想要的。看起来你最好颠倒这个 Dockerfile 的顺序:首先构建 JavaScript 部分,然后构建最终的应用程序,COPYing dist 在那里构建的前端文件夹。
  • 您可以将 && 用于需要在前一个命令成功时运行的序列操作。例如./run_some_cmd && echo "previous cmd is successful
  • @tripleee 是的,这可行。
  • @DavidMaze 不使用 go 构建文件,我如何npm run?或者我可以吗?

标签: bash shell docker dockerfile grafana


【解决方案1】:

最简单的解决方案可能是在npm run watch之前运行npm run build

【讨论】:

  • 它仍然不会等待它完成不?
  • 上一个命令一旦启动容器就成功了,但是容器内部发生的事情与该命令无关。我需要一种方法来检查一个命令是否在容器内执行完毕,以便可以运行另一个命令。
  • 嘿!我将CMD npm run watch 更改为CMD npm run build && ./bin/linux-amd64/grafana-server,它可以工作,但容器需要5 分钟才能运行,因为npm run build 非常慢。您可以更改答案,以便我接受。
  • 有什么方法知道npm run build 可以加速吗?
  • 我不知道
【解决方案2】:

扩展@AussiDan的答案,我将我的Dockerfile更改为:

FROM golang:1.9 AS build-go
RUN go get github.com/grafana/grafana; exit 0
WORKDIR $GOPATH/src/github.com/grafana/grafana
RUN go run build.go setup && go run build.go build

FROM node:8 AS build-node
COPY --from=build-go $HOME/go/src/github.com/grafana/grafana .
RUN npm install -g yarn && yarn install --pure-lockfile && npm run build
CMD ./bin/linux-amd64/grafana-server

EXPOSE 3000

这样当我启动 grafana 服务器时,构建的 javascript 文件就已经在镜像中了。

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2011-09-20
    • 2015-03-19
    • 1970-01-01
    • 2018-04-27
    • 2019-12-31
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多