我正在尝试创建一个docker映像并同时对其进行标记。这样,我可以创建在“ docker build”命令中使用-t选项的脚本。因此,部署新映像的工作人员无需键入docker命令,只需运行脚本即可。
我遇到的问题是“ docker build”命令也启动了映像。这会导致docker build命令到达映像运行点时被“卡住”,因为假定映像无限期运行,这是一项服务,因此build命令永远不会完成,结果是标记在构建命令的“ -t”部分提到的内容永远不会应用于新映像。
因此,没有办法识别新图像,因为它们都没有标签。我可以通过以下方式修复该问题:使用Ctrl + C终止build命令,然后再使用“ docker tag”命令。但这意味着我不能将build和tag命令放在bash脚本中,因为我必须标记图像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构建器不启动映像而是仅创建映像,这将是一等奖。
答案 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