为Dockerhub编写Dockerfile自动构建

时间:2016-04-25 23:41:54

标签: docker dockerfile

我是Docker的新手,所以我正在努力解决一个非常基本的问题。

我有一个maven项目。在本地环境中,我所做的只是运行项目:

mvn clean package jetty:run

我现在正尝试将此包装为链接到github repo的Automated dockerhub构建。以下是我采取的步骤:

  1. 创建如下的Dockerfile并将其添加到基本文件夹
  2. 将代码提交给github
  3. 创建并将dockerhub中的Autobuild仓库链接到Github仓库。
  4. 进行必要的更改以指向特定分支和Dockerfile
  5. 当我提交更改时,我可以看到它触发构建并且构建成功。但是,当我运行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命令,但我无法使其正常工作。

    请帮忙。

2 个答案:

答案 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和RUN mvn install

这意味着由于ONBUILD指令,生成的图像已经复制了源并且mvn编译了应用程序,使其成为Dockerhub自动构建的不良候选者。