【发布时间】:2019-07-07 19:26:38
【问题描述】:
我正在尝试创建一个 docker 映像并同时对其进行标记。这样我可以创建一个在“docker build”命令中使用 -t 选项的脚本。因此,部署新镜像的工作人员无需键入 docker 命令,他们只需运行脚本即可。
我遇到的问题是“docker build”命令也会启动映像。这会导致 docker build 命令在到达映像运行的位置时“卡住”,因为映像假定无限期运行,它是一项服务,因此构建命令永远不会完成,结果是标签构建命令的“-t”部分中提到的永远不会应用于新图像。
所以没有办法识别新图像,因为它们都没有标签。我可以通过使用 Ctrl+C 终止构建命令,然后使用“docker tag”命令来修复它。但这意味着我不能将构建和标记命令放在 bash 脚本中,因为我必须标记图像 ID 而不是名称。每次我运行 docker build 命令时都会发生变化。
我尝试了以下方法:
- 按 Ctrl+C 可终止在新映像中运行的应用程序。这确实结束了当前正在运行的应用程序。但这也会终止 docker build 命令。因此图像标签永远不会被应用。
- 我尝试在另一个终端中使用“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 不启动镜像而只是创建它,这将是一等奖。
【问题讨论】: