我是Docker的新手,所以我正在努力解决一个非常基本的问题。
我有一个maven项目。在本地环境中,我所做的只是运行项目:
mvn clean package jetty:run
我现在正尝试将此包装为链接到github repo的Automated dockerhub构建。以下是我采取的步骤:
当我提交更改时,我可以看到它触发构建并且构建成功。但是,当我运行docker镜像时,它返回时出现以下错误:
docker: Error response from daemon: Container command 'mvn clean package jetty:run' not found or does not exist..
这是文件夹结构:
/Dockerfile
/pom.xml
/src/<folders that contain the code>
以下是我在Dockerfile中的内容:
FROM maven:3.3.9-jdk-8
CMD ["mvn clean package jetty:run"]
我想我错过了将代码的副本提取到容器中。但这样做的最佳方式是什么?我尝试了COPY
命令,但我无法使其正常工作。
请帮忙。
答案 0 :(得分:1)
这里的问题是,&#34; mvn&#34;是命令和&#34;清洁&#34;,&#34;包&#34;和&#34;码头:跑步&#34;是它的参数。像bash这样的贝壳会自动分开。 Docker没有。
CMD [&#34; mvn clean package jetty:run&#34;]让docker搜索名称类似&#34; / usr / bin / mvn clean package jetty:run&#34;这当然不存在。
正确的形式是:
CMD ["executable","param1","param2"]
在你的情况下:
CMD ["/usr/bin/mvn", "clean", "package", "jetty:run"]
答案 1 :(得分:0)
maven Dockerfile已包含复制指令,在您docker build
图片时使用ONBUILD
directive激活复制指令。
它基于maven image,将mvn放入/usr/bin
。
您不应该执行maven命令,而应该执行described in the doc
FROM maven:3.2-jdk-7-onbuild
CMD ["do-something-with-built-packages"]
将此文件放在项目的根目录中,位于
旁边pom.xml
。此图像包含多个ONBUILD触发器,应该是引导所需的全部触发器。构建将
COPY . /usr/src/app
和RUNmvn install
。
这意味着由于ONBUILD
指令,生成的图像已经复制了源并且mvn编译了应用程序,使其成为Dockerhub自动构建的不良候选者。