Grails 3.1.4和Docker – grails命令返回“没有find名称为web的configuration文件”

我有一个简单的Grails应用程序,运行良好。 使用grails webconfiguration文件和grails run-app

然而,当我从应用程序中构build一个grails dependency-report --stacktrace发送到grails dependency-report --stacktrace的grails命令(例如grails run-app --stacktracegrails dependency-report --stacktrace将失败并显示stacktrace:

 | Error Error occurred running Grails CLI: No profile found for name [web]. (NOTE: Stack trace has been filtered. Use --verbose to see entire trace.) java.lang.IllegalStateException: No profile found for name [web]. at org.grails.cli.GrailsCli.initializeProfile(GrailsCli.groovy:507) at org.grails.cli.GrailsCli.initializeApplication(GrailsCli.groovy:308) at org.grails.cli.GrailsCli.execute(GrailsCli.groovy:271) at org.grails.cli.GrailsCli.main(GrailsCli.groovy:162) | Error Error occurred running Grails CLI: No profile found for name [web]. 

Docker Build命令:从grails应用程序的根目录运行。 用户在docker组中。

 docker build -t mygrailsapp . 

DockerFile:(Build会在运行grails dependency-report –stacktrace时失败,如果我删除了这个命令,那么编译就完成了,但是第一次用默认命令运行这个程序会失败,同样的错误。

 # # My Dockerfile # # https://github.com/dockerfile/java # https://github.com/dockerfile/java/tree/master/oracle-java8 # https://hub.docker.com/r/mozart/grails/ # Pull base image. FROM ubuntu RUN apt-get update # install apt-get-repository RUN \ apt-get install -y software-properties-common wget unzip git # Install Java. RUN \ echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update && \ apt-get install -y oracle-java8-installer rm -rf /var/lib/apt/lists/* && \ rm -rf /var/cache/oracle-jdk8-installer # Define working directory. WORKDIR /data # Define commonly used JAVA_HOME variable ENV JAVA_HOME /usr/lib/jvm/java-8-oracle # Set customizable env vars defaults. # Set Grails version (default: 3.1.4; min: 3.0.0; max: 3.1.4). ENV GRAILS_VERSION 3.1.4 # Install Grails WORKDIR /usr/lib/jvm # TODO put grails zips on your own server with decent bandwidth RUN wget https://github.com/grails/grails-core/releases/download/v$GRAILS_VERSION/grails-$GRAILS_VERSION.zip && \ unzip grails-$GRAILS_VERSION.zip && \ rm -rf grails-$GRAILS_VERSION.zip && \ ln -s grails-$GRAILS_VERSION grails # Setup Grails path. ENV GRAILS_HOME /usr/lib/jvm/grails ENV PATH $GRAILS_HOME/bin:$PATH # Create App Directory RUN mkdir /app # Set Workdir WORKDIR /app # Copy App files COPY . /app # Run Grails dependency-report command to pre-download dependencies but not # create unnecessary build files or artifacts. RUN grails dependency-report --stacktrace # Set Default Behavior ENTRYPOINT ["grails"] CMD ["run-app"] 

build立:

Ubuntu 14.04 LTS 64

Jave:Oracle JDK 1.8.0_77 64

通过sdkman 4.0.32:

Grails 3.14 Groovy 2.4.6 Gradle 2.12

Docker Client:版本:1.10.3 API版本:1.22 Go版本:go1.5.3 Git commit:20f81dd内置:Thu Mar 10 15:54:52 2016 OS / Arch:linux / amd64

当我将使用webconfiguration文件的Grails 3.1.4应用程序移动到新的机器时,我遇到了同样的问题。

在我的应用程序根目录下执行gradle clean触发正在下载的Grails Maven依赖项,之后grails命令开始工作。

对于这个问题的其他人,我刚刚删除(或宁可移动,以防万一我需要它)我的生成文件夹,然后再次运行,它重新下载所有的依赖关系,并马上工作

我接下来修复它:

  1. 删除(或重命名) .gradle目录
  2. 删除(或重命名) gradle目录
  3. 删除(或重命名)生成目录

现在,我可以使用grails run-app

为了改善这种情况,你可以设置GRADLE_USER_HOME env var,在每次运行docker的时候,你不需要build立目录,就在第一次之前,实际上删除了build / .dependencies文件就行了

 VOLUME ["/gradle"] ENV GRADLE_USER_HOME /gradle 

我通过删除build文件来解决这个问题。 通过删除,并再次运行它可能会解决这个问题。

我select删除它,因为我甚至不能调用grails函数。

最有可能的是你已经登陆这个页面,因为你已经在search引擎中search了错误,并且把它带到了这里。

症状:当你在之前已经存在的项目下运行“grails”时(不pipe是在不同的PC上,还是来自像GIT或SVN这样的源代码控制,并且你错误地包含了“build”目录)。

请参阅https://mythinkpond.com/2016/11/29/grails-no-profile-found-for-name-web-illegalstateexception/

我find了答案。 我不得不从github下载grailsconfiguration文件并将它们安装在$ GRAILS_HOME中。 我在docker文件中设置了Grails环境variables之后立即放置了这一步。

请参阅下面的示例docker文件片段:

 ... # Setup Grails path. ENV GRAILS_HOME /usr/lib/jvm/grails ENV PATH $GRAILS_HOME/bin:$PATH # Setup grails profiles RUN wget https://codeload.github.com/grails/grails-profile-repository/zip/master && \ unzip master && \ mv grails-profile-repository-master/profiles/ $GRAILS_HOME && \ rm -rf master && \ rm -rf grails-profile-repository-master ... 

我从Dockerfile中删除了RUN依赖关系报告,并解决了这个问题。

但是,这意味着依赖关系不再安装到映像中,并且必须在容器首次创build时下载。 不是一个理想的情况。

我不明白为什么在运行应用程序时需要Webconfiguration文件。 我以为这个configuration文件决定了用来设置grails应用程序的模板。 一旦这样做,为什么它需要在运行时? 什么是“networkingconfiguration文件”。 这是一个可以下载和添加的单个文件吗?

另一个奇怪的是,从mozart / grails创build的映像,具有RUN依赖性报告,在Docker工具箱上运行正常,但在Docker for Linux上失败。 我不明白相同的图像将在不同的docker平台上有不同的行为。 我认为这是docker的一点。

对不起,提供更多的问题比这里的答案,但希望能够更好地了解这一切。