【问题标题】:Build a docker image without staring it在不盯着它的情况下构建一个 docker 镜像
【发布时间】:2019-07-07 19:26:38
【问题描述】:

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

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

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

我尝试了以下方法:

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

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

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 build 继续运行,从而应用所需的标签。或者强制 docker build 不启动镜像而只是创建它,这将是一等奖。

【问题讨论】:

    标签: docker build


    【解决方案1】:

    只需将 RUN 替换为 CMD 就不会在构建过程中运行:

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

    干杯

    【讨论】:

    • 我现在看到了问题。谢谢!!我为此苦苦挣扎了很长一段时间。我不小心在运行命令中运行了图像,而不仅仅是编译它!再次感谢!
    【解决方案2】:

    任何RUN指令都会在构建Docker镜像时执行。我怀疑如果您更改 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
    

    【讨论】:

    • 感谢您的反馈。我搞砸了!我从其他地方复制并粘贴了它,但没有看到它也启动了应用程序。再次感谢!
    猜你喜欢
    • 2017-04-09
    • 2020-04-06
    • 2022-08-18
    • 2020-10-06
    • 2021-11-25
    • 2016-11-21
    • 2022-11-10
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多