maven - 如何使用dockerfile中的Maven创建和运行Docker镜像

标签 maven docker

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

mvn verify 

快速的Google搜索给了我- 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>

我说错了

POM file C:docker specified with the -f/--file command line argument does not exist



我知道,我的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进行构建时的一个小窍门(超出问题范围,但要知道):您可以在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 .层重新启动(因此不必重新下载所有依赖项)。但是,当然,如果您更新pom.xml,Docker将在下一个构建过程中重新下载所有依赖项。

关于maven - 如何使用dockerfile中的Maven创建和运行Docker镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55303475/

相关文章:

java - Maven:未能执行目标 org.apache.maven.plugins:maven-resources-plugin:2.7:resources

java - 如何找到 Spring beans.xml

mysql - Docker 构建失败

Docker 挂载悬空卷

在自托管代理上运行容器作业时,Azure DevOps YAML 构建失败

java - 通过命令行或在指定时间自动触发 Eclipse clean

java - 节奏模板引擎与 GAE/J : AccessControlException in even simplest case

java - 在 Tomcat 7 上部署 Seam 项目(war 文件)- Maven : two components with same name

django - 来自Docker容器的Django loaddata命令

docker - 无法将 docker url 与 PHP 单元连接