繁体   English   中英

如何使用 Maven 从 dockerfile 创建和运行 docker 镜像

[英]how to create and run docker image using Maven from dockerfile

我是 docker 新手,我们正在尝试为我的项目创建 docker 镜像,我们使用该镜像在简单的 Maven 命令中运行

mvn verify 

一个快速的谷歌搜索给了我 - Dockerfile

 FROM maven:3.6.0-jdk-8
 COPY src C:/docker/
 COPY pom.xml C:/docker/
 COPY testng.xml C:/docker/
 RUN mvn -f C:\docker clean verify    

我对上述命令的理解是,从 docker hub 获取 maven 3.6 映像并将现有项目文件复制到 docker 容器并运行 maven 命令。

我的POM.XML看起来像

    <dependencies>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>1.2.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-jvm-deps</artifactId>
        <version>1.0.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-testng</artifactId>
        <version>1.2.5</version>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.9.8</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>net.masterthought</groupId>
        <artifactId>cucumber-reporting</artifactId>
        <version>3.8.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.44.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.6.4</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.4</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>testng.xml</suiteXmlFile>
                </suiteXmlFiles>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
        </plugin>
        <plugin>
            <groupId>net.masterthought</groupId>
            <artifactId>maven-cucumber-reporting</artifactId>
            <version>3.8.0</version>
            <executions>
                <execution>
                    <id>execution</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <projectName>sample</projectName>
                        <outputDirectory>target/cucumber-reports/advanced-reports</outputDirectory>
                        <cucumberOutput>target/cucumber-reports/CucumberTestReport.json</cucumberOutput>
                        <buildNumber>1</buildNumber>
                        <parallelTesting>false</parallelTesting>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我收到一条错误消息

使用 -f/--file 命令行参数指定的 POM 文件 C:docker 不存在

我知道,我的 docker 基础知识有问题,但是如果您能教我/告诉我这里可能存在什么问题,那将有很大帮助。

C:/docker/不是maven:3.6.0-jdk-8镜像中的有效路径,你应该使用类似/docker/东西。

以下Dockerfile

FROM maven:3.6.0-jdk-8

COPY pom.xml /docker/
COPY testng.xml /docker/
COPY src /docker/

RUN  cd /docker/ && mvn clean verify

应该可以工作并在 Docker 容器中运行mvn clean verify 您还可以设置工作目录以避免在任何地方重复/docker/

FROM    maven:3.6.0-jdk-8

RUN     mkdir /docker

WORKDIR /docker

COPY    pom.xml .
COPY    testng.xml .
COPY    src .

RUN     mvn clean verify

最后,像您一样使用 Maven 构建时的一个小技巧(超出您的问题范围但很高兴知道):您可以通过在COPY pom.xml /docker/之后下载依赖项(使用mvn dependency:resolve )来显着减少构建时间COPY pom.xml /docker/指令,例如:

FROM    maven:3.6.0-jdk-8

RUN     mkdir /docker

WORKDIR /docker

COPY    pom.xml .
RUN     mvn dependency:resolve

COPY    testng.xml .
COPY    src .

RUN     mvn clean verify

通过这样做,如果你构建你的镜像两次,但第二次只是更新src文件夹中的文件,Docker 将能够使用缓存层并从COPY src .重新启动COPY src . 层(因此不会重新下载所有依赖项)。 但是当然,如​​果您更新pom.xml ,Docker 将在下一次构建期间重新下载所有依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM