如何使用Dockerfile正确构建spring boot docker镜像?

时间:2016-10-03 19:03:07

标签: docker spring-boot docker-build

我有以下春季启动项目结构:

pwd
/Users/eugene/Documents/Dev/Java/workspace/Springboot-Receiver-API

tree
.
├── Dockerfile
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── myconpany
│       │           └── myproject
│       │               └── data
│       │                   ├── Application.java
│       │                   ├── ConsumerThreadPool.java
│       │                   ├── ErpConsumer.java
│       │                   ├── configs
│       │                   │   ├── ConsumerConfigFactory.java
│       │                   │   └── DatabaseConfig.java
│       │                   ├── controllers
│       │                   │   ├── AppBeans.java
│       │                   │   ├── BankcustpaymidtableController.java
│       │                   │   ├── CompanynafcodeController.java
│       │                   │   ├── CustcollectionscontactController.java
│       │                   │   ├── CustdirectdebitmandateController.java
│       │                   │   ├── CusttableController.java
│       │                   │   ├── CusttradingpartnercodeController.java
│       │                   │   ├── DirnameaffixController.java
│       │                   │   ├── DirnamesequenceController.java
│       │                   │   ├── DirorganizationnameController.java
│       │                   │   ├── DirpartylocationController.java
│       │                   │   ├── DirpartytableController.java
│       │                   │   ├── DirpersonnameController.java
│       │                   │   ├── DirpersonuserController.java
│       │                   │   ├── HcmworkerController.java
│       │                   │   ├── LogisticselectronicaddressController.java
│       │                   │   ├── LogisticspostaladdressController.java
│       │                   │   ├── LvpaymtranscodesController.java
│       │                   │   ├── MainController.java
│       │                   │   ├── McrcusttableController.java
│       │                   │   ├── McrmessageassociationCOntroller.java
│       │                   │   ├── RetailcusttableController.java
│       │                   │   ├── SpringBootKafkaProducer.java
│       │                   │   ├── Taxgstreliefgroupheading_myController.java
│       │                   │   ├── Taxinformationcusttable_inController.java
│       │                   │   └── WhscusttableController.java
│       │                   └── models
│       │                       ├── Bankcustpaymidtable.java
│       │                       ├── BankcustpaymidtableCompositeKey.java
│       │                       ├── BankcustpaymidtableDao.java
│       │                       ├── Companynafcode.java
│       │                       ├── CompanynafcodeCompositeKey.java
│       │                       ├── CompanynafcodeDao.java
│       │                       ├── Custcollectionscontact.java
│       │                       ├── CustcollectionscontactCompositeKey.java
│       │                       ├── CustcollectionscontactDao.java
│       │                       ├── Custdirectdebitmandate.java
│       │                       ├── CustdirectdebitmandateCompositeKey.java
│       │                       ├── CustdirectdebitmandateDao.java
│       │                       ├── Custtable.java
│       │                       ├── CusttableCompositeKey.java
│       │                       ├── CusttableDao.java
│       │                       ├── Custtradingpartnercode.java
│       │                       ├── CusttradingpartnercodeCompositeKey.java
│       │                       ├── CusttradingpartnercodeDao.java
│       │                       ├── Dirnameaffix.java
│       │                       ├── DirnameaffixCompositeKey.java
│       │                       ├── DirnameaffixDao.java
│       │                       ├── Dirnamesequence.java
│       │                       ├── DirnamesequenceCompositeKey.java
│       │                       ├── DirnamesequenceDao.java
│       │                       ├── Dirorganizationname.java
│       │                       ├── DirorganizationnameCompositeKey.java
│       │                       ├── DirorganizationnameDao.java
│       │                       ├── Dirpartylocation.java
│       │                       ├── DirpartylocationCompositeKey.java
│       │                       ├── DirpartylocationDao.java
│       │                       ├── Dirpartytable.java
│       │                       ├── DirpartytableCompositeKey.java
│       │                       ├── DirpartytableDao.java
│       │                       ├── Dirpersonname.java
│       │                       ├── DirpersonnameCompositeKey.java
│       │                       ├── DirpersonnameDao.java
│       │                       ├── Dirpersonuser.java
│       │                       ├── DirpersonuserCompositeKey.java
│       │                       ├── DirpersonuserDao.java
│       │                       ├── Hcmworker.java
│       │                       ├── HcmworkerCompositeKey.java
│       │                       ├── HcmworkerDao.java
│       │                       ├── Logisticselectronicaddress.java
│       │                       ├── LogisticselectronicaddressCompositeKey.java
│       │                       ├── LogisticselectronicaddressDao.java
│       │                       ├── Logisticspostaladdress.java
│       │                       ├── LogisticspostaladdressCompositeKey.java
│       │                       ├── LogisticspostaladdressDao.java
│       │                       ├── Lvpaymtranscodes.java
│       │                       ├── LvpaymtranscodesCompositeKey.java
│       │                       ├── LvpaymtranscodesDao.java
│       │                       ├── Mcrcusttable.java
│       │                       ├── McrcusttableCompositeKey.java
│       │                       ├── McrcusttableDao.java
│       │                       ├── Mcrmessageassociation.java
│       │                       ├── McrmessageassociationCompositeKey.java
│       │                       ├── McrmessageassociationDao.java
│       │                       ├── Retailcusttable.java
│       │                       ├── RetailcusttableCompositeKey.java
│       │                       ├── RetailcusttableDao.java
│       │                       ├── Taxgstreliefgroupheading_my.java
│       │                       ├── Taxgstreliefgroupheading_myCompositeKey.java
│       │                       ├── Taxgstreliefgroupheading_myDao.java
│       │                       ├── Taxinformationcusttable_in.java
│       │                       ├── Taxinformationcusttable_inCompositeKey.java
│       │                       ├── Taxinformationcusttable_inDao.java
│       │                       ├── Whscusttable.java
│       │                       ├── WhscusttableCompositeKey.java
│       │                       └── WhscusttableDao.java
│       └── resources
│           └── application.properties
└── target
    ├── Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar
    ├── Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar.original
    ├── classes
    │   ├── META-INF
    │   │   ├── MANIFEST.MF
    │   │   └── maven
    │   │       ├── netgloo
    │   │       │   └── spring-boot-mysql-jpa-hibernate
    │   │       │       ├── pom.properties
    │   │       │       └── pom.xml
    │   │       └── myconpany
    │   │           └── Spring-Boot-ReceiverAPI
    │   │               ├── pom.properties
    │   │               └── pom.xml
    │   ├── application.properties
    │   └── com
    │       └── myconpany
    │           └── myproject
    │               └── data
    │                   ├── Application.class
    │                   ├── ConsumerThreadPool.class
    │                   ├── ErpConsumer$1.class
    │                   ├── ErpConsumer$10.class
    │                   ├── ErpConsumer$11.class
    │                   ├── ErpConsumer$2.class
    │                   ├── ErpConsumer$3.class
    │                   ├── ErpConsumer$4.class
    │                   ├── ErpConsumer$5.class
    │                   ├── ErpConsumer$6.class
    │                   ├── ErpConsumer$7.class
    │                   ├── ErpConsumer$8.class
    │                   ├── ErpConsumer$9.class
    │                   ├── ErpConsumer.class
    │                   ├── configs
    │                   │   ├── ConsumerConfigFactory.class
    │                   │   └── DatabaseConfig.class
    │                   ├── controllers
    │                   │   ├── AppBeans.class
    │                   │   ├── BankcustpaymidtableController$1.class
    │                   │   ├── BankcustpaymidtableController.class
    │                   │   ├── CompanynafcodeController$1.class
    │                   │   ├── CompanynafcodeController.class
    │                   │   ├── CustcollectionscontactController$1.class
    │                   │   ├── CustcollectionscontactController.class
    │                   │   ├── CustdirectdebitmandateController$1.class
    │                   │   ├── CustdirectdebitmandateController.class
    │                   │   ├── CusttableController.class
    │                   │   ├── CusttradingpartnercodeController$1.class
    │                   │   ├── CusttradingpartnercodeController.class
    │                   │   ├── DirnameaffixController$1.class
    │                   │   ├── DirnameaffixController.class
    │                   │   ├── DirnamesequenceController$1.class
    │                   │   ├── DirnamesequenceController.class
    │                   │   ├── DirorganizationnameController$1.class
    │                   │   ├── DirorganizationnameController.class
    │                   │   ├── DirpartylocationController$1.class
    │                   │   ├── DirpartylocationController.class
    │                   │   ├── DirpartytableController$1.class
    │                   │   ├── DirpartytableController.class
    │                   │   ├── DirpersonnameController$1.class
    │                   │   ├── DirpersonnameController.class
    │                   │   ├── DirpersonuserController$1.class
    │                   │   ├── DirpersonuserController.class
    │                   │   ├── HcmworkerController.class
    │                   │   ├── LogisticselectronicaddressController$1.class
    │                   │   ├── LogisticselectronicaddressController.class
    │                   │   ├── LogisticspostaladdressController$1.class
    │                   │   ├── LogisticspostaladdressController.class
    │                   │   ├── LvpaymtranscodesController$1.class
    │                   │   ├── LvpaymtranscodesController.class
    │                   │   ├── MainController.class
    │                   │   ├── McrcusttableController$1.class
    │                   │   ├── McrcusttableController.class
    │                   │   ├── McrmessageassociationCOntroller$1.class
    │                   │   ├── McrmessageassociationCOntroller.class
    │                   │   ├── RetailcusttableController$1.class
    │                   │   ├── RetailcusttableController.class
    │                   │   ├── SpringBootKafkaProducer.class
    │                   │   ├── Taxgstreliefgroupheading_myController$1.class
    │                   │   ├── Taxgstreliefgroupheading_myController.class
    │                   │   ├── Taxinformationcusttable_inController$1.class
    │                   │   ├── Taxinformationcusttable_inController.class
    │                   │   ├── WhscusttableController$1.class
    │                   │   └── WhscusttableController.class
    │                   └── models
    │                       ├── Bankcustpaymidtable.class
    │                       ├── BankcustpaymidtableCompositeKey.class
    │                       ├── BankcustpaymidtableDao.class
    │                       ├── Companynafcode.class
    │                       ├── CompanynafcodeCompositeKey.class
    │                       ├── CompanynafcodeDao.class
    │                       ├── Custcollectionscontact.class
    │                       ├── CustcollectionscontactCompositeKey.class
    │                       ├── CustcollectionscontactDao.class
    │                       ├── Custdirectdebitmandate.class
    │                       ├── CustdirectdebitmandateCompositeKey.class
    │                       ├── CustdirectdebitmandateDao.class
    │                       ├── Custtable.class
    │                       ├── CusttableCompositeKey.class
    │                       ├── CusttableDao.class
    │                       ├── Custtradingpartnercode.class
    │                       ├── CusttradingpartnercodeCompositeKey.class
    │                       ├── CusttradingpartnercodeDao.class
    │                       ├── Dirnameaffix.class
    │                       ├── DirnameaffixCompositeKey.class
    │                       ├── DirnameaffixDao.class
    │                       ├── Dirnamesequence.class
    │                       ├── DirnamesequenceCompositeKey.class
    │                       ├── DirnamesequenceDao.class
    │                       ├── Dirorganizationname.class
    │                       ├── DirorganizationnameCompositeKey.class
    │                       ├── DirorganizationnameDao.class
    │                       ├── Dirpartylocation.class
    │                       ├── DirpartylocationCompositeKey.class
    │                       ├── DirpartylocationDao.class
    │                       ├── Dirpartytable.class
    │                       ├── DirpartytableCompositeKey.class
    │                       ├── DirpartytableDao.class
    │                       ├── Dirpersonname.class
    │                       ├── DirpersonnameCompositeKey.class
    │                       ├── DirpersonnameDao.class
    │                       ├── Dirpersonuser.class
    │                       ├── DirpersonuserCompositeKey.class
    │                       ├── DirpersonuserDao.class
    │                       ├── Hcmworker.class
    │                       ├── HcmworkerCompositeKey.class
    │                       ├── HcmworkerDao.class
    │                       ├── Logisticselectronicaddress.class
    │                       ├── LogisticselectronicaddressCompositeKey.class
    │                       ├── LogisticselectronicaddressDao.class
    │                       ├── Logisticspostaladdress.class
    │                       ├── LogisticspostaladdressCompositeKey.class
    │                       ├── LogisticspostaladdressDao.class
    │                       ├── Lvpaymtranscodes.class
    │                       ├── LvpaymtranscodesCompositeKey.class
    │                       ├── LvpaymtranscodesDao.class
    │                       ├── Mcrcusttable.class
    │                       ├── McrcusttableCompositeKey.class
    │                       ├── McrcusttableDao.class
    │                       ├── Mcrmessageassociation.class
    │                       ├── McrmessageassociationCompositeKey.class
    │                       ├── McrmessageassociationDao.class
    │                       ├── Retailcusttable.class
    │                       ├── RetailcusttableCompositeKey.class
    │                       ├── RetailcusttableDao.class
    │                       ├── Taxgstreliefgroupheading_my.class
    │                       ├── Taxgstreliefgroupheading_myCompositeKey.class
    │                       ├── Taxgstreliefgroupheading_myDao.class
    │                       ├── Taxinformationcusttable_in.class
    │                       ├── Taxinformationcusttable_inCompositeKey.class
    │                       ├── Taxinformationcusttable_inDao.class
    │                       ├── Whscusttable.class
    │                       ├── WhscusttableCompositeKey.class
    │                       └── WhscusttableDao.class
    ├── generated-sources
    │   └── annotations
    ├── maven-archiver
    │   └── pom.properties
    ├── maven-status
    │   └── maven-compiler-plugin
    │       └── compile
    │           └── default-compile
    │               ├── createdFiles.lst
    │               └── inputFiles.lst
    └── test-classes

我的Dockerfile如下所示:

FROM java:8
ADD target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

从项目根目录(/Users/eugene/Documents/Dev/Java/workspace/Springboot-Receiver-API)运行以下命令来构建docker镜像:

sudo docker build - < Dockerfile

我得到以下输出:

Sending build context to Docker daemon 2.048 kB
Step 1 : FROM java:8
 ---> 96cddf5ae9f1
Step 2 : ADD target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar app.jar
lstat target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar: no such file or directory

在同一目录中,当我运行ls target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar时,我得到:

target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar

为了让docker build能够识别我的target/Spring-Boot-ReceiverAPI-0.0.1-SNAPSHOT.jar文件,我做了什么?

2 个答案:

答案 0 :(得分:1)

AFAIK您可以使用maven-resources-plugin来确保Dockerfile位于适当的位置(然后您甚至可以将jar文件的名称作为变量放入Dockerfile中):

<build>
    <resources>       
        <resource>
            <directory>${basedir}/src/main/docker</directory>
            <filtering>true</filtering>
            <includes>
                <include>Dockerfile</include>
            </includes>
        </resource>
    </resources>
</build>

或者,更好的是,您按照此处所述的maven-docker-plugin进行操作: https://spring.io/guides/gs/spring-boot-docker/

希望有所帮助!

答案 1 :(得分:0)

您可以使用Spotify中的dockerfile-maven-plugin简化事情。
默认情况下,该插件在Maven项目的基本目录中寻找Dockerfile

您可以使用它,例如:

<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <repository>${project.groupId}/${project.artifactId}</repository>
                <tag>latest</tag>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

此示例使用latest作为标记版本创建图像。
您还可以指定一个特定的版本,例如pom的版本:

<tag>${project.version}</tag>

要从先前执行过的mvn package来构建图像,请执行以下操作:

mvn dockerfile:build

要在构建映像之前打包应用程序:

mvn clean package dockerfile:build