如何正确构build使用Dockerfile的弹簧启动泊坞窗图像?

我有以下的spring启动项目结构:

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)运行以下命令来构build一个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文件,需要做些什么?

AFAIK你可以使用maven-resources-plugin来确保Dockerfile在适当的位置(然后你甚至可以把jar文件的名字作为variables放到你的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/

希望有所帮助!