在不凝视的情况下构建docker镜像

时间:2019-07-07 19:26:38

标签: docker build

我正在尝试创建一个docker映像并同时对其进行标记。这样,我可以创建在“ docker build”命令中使用-t选项的脚本。因此,部署新映像的工作人员无需键入docker命令,只需运行脚本即可。

我遇到的问题是“ docker build”命令也启动了映像。这会导致docker build命令到达映像运行点时被“卡住”,因为假定映像无限期运行,这是一项服务,因此build命令永远不会完成,结果是标记在构建命令的“ -t”部分提到的内容永远不会应用于新映像。

因此,没有办法识别新图像,因为它们都没有标签。我可以通过以下方式修复该问题:使用Ctrl + C终止build命令,然后再使用“ docker tag”命令。但这意味着我不能将build和tag命令放在bash脚本中,因为我必须标记图像ID而不是名称。每次我运行docker build命令时,都会改变。

我尝试了以下方法:

  1. 按Ctrl + C可终止在新映像中运行的应用程序。这确实结束了当前正在运行的应用程序。但这也会终止docker build命令。因此,图像标签永远不会被应用。
  2. 我尝试在另一个终端中使用“ docker ps”来查找当前正在运行的容器,并使用“ docker stop ID”将其停止。这也会停止应用程序/容器,但这会在docker build命令上生成错误,并且再次无法完成并且不应用标签。

这是我在尝试上述步骤1或2并运行“ docker image list”命令后看到的,既没有设置tag字段也没有设置存储库字段:

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
<none>                <none>              df355e74685b        6 minutes ago       493MB
openjdk               latest              e92ef2c3a3dd        12 days ago         470MB
openjdk               8                   b84359d0cbce        3 weeks ago         488MB
portainer/portainer   latest              da2759008147        4 weeks ago         75.4MB

我的docker build命令:

sudo docker build -t slite/cloud-db-host -f slite/cloud/db/Dockerfile.Host.docker .

这是我的docker文件:

FROM openjdk:8
LABEL maintainer="techss.co.za"
LABEL vendor="techss.co.za"
LABEL app="slite-db-host"
LABEL repository="slite"
COPY slite/cloud/db /slite/cloud/db
COPY slite/lib/java /slite/lib/java
EXPOSE 51173
WORKDIR .
RUN javac slite/cloud/db/*.java && javac slite/lib/java/*.java && java slite.cloud.db.SliteDBHost
ENTRYPOINT ["java","slite.cloud.db.SliteDBHost"]

这是docker build的输出:

Sending build context to Docker daemon  13.43MB
Step 1/11 : FROM openjdk:8
 ---> b84359d0cbce
Step 2/11 : LABEL maintainer="techss.co.za"
 ---> Running in 3dc3f0fcea2c
Removing intermediate container 3dc3f0fcea2c
 ---> 0946737c1386
Step 3/11 : LABEL vendor="techss.co.za"
 ---> Running in c289dd741158
Removing intermediate container c289dd741158
 ---> 00d5a7f3d7e5
Step 4/11 : LABEL app="slite-db-host"
 ---> Running in 1d7e953bdf6f
Removing intermediate container 1d7e953bdf6f
 ---> 4540390e8bb5
Step 5/11 : LABEL repository="slite"
 ---> Running in c366a92becb5
Removing intermediate container c366a92becb5
 ---> c9be0ef5e6da
Step 6/11 : COPY slite/cloud/db /slite/cloud/db
 ---> f3efeb406aef
Step 7/11 : COPY slite/lib/java /slite/lib/java
 ---> 797bf7df8335
Step 8/11 : EXPOSE 51173
 ---> Running in 93389673e9cc
Removing intermediate container 93389673e9cc
 ---> abfb10413edf
Step 9/11 : WORKDIR .
 ---> Running in 77a67baa9be6
Removing intermediate container 77a67baa9be6
 ---> 7d313395f072
Step 10/11 : RUN javac slite/cloud/db/*.java && javac slite/lib/java/*.java && java slite.cloud.db.SliteDBHost
 ---> Running in 99edcf79d5f4
Sun Jul 07 18:47:02 UTC 2019 Listening on port 51173

它只是挂在最后一行,我假设它正在等待容器内运行的应用程序结束,因为它是服务,所以永远不会发生。因此,即使容器正在运行,我如何强制Docker构建继续进行,从而应用所需的标签。或强制Docker构建器不启动映像而是仅创建映像,这将是一等奖。

2 个答案:

答案 0 :(得分:0)

只需用CMD替换RUN,它就不会在构建过程中运行:

CMD ["sh","-c","javac slite/cloud/db/*.java && javac slite/lib/java/*.java && java slite.cloud.db.SliteDBHost"]

欢呼

答案 1 :(得分:0)

构建Docker映像时,将执行任何RUN指令。我怀疑如果更改Dockerfile的第10行,您的问题是否会解决。

之前:

RUN javac slite/cloud/db/*.java && javac slite/lib/java/*.java && java slite.cloud.db.SliteDBHost

之后:

RUN javac slite/cloud/db/*.java && javac slite/lib/java/*.java