12

我有一个简单的 grails 应用程序,它本身运行良好。使用 grails web profile 没有问题grails run-app

但是,当我从应用程序中构建 docker 映像时,grails 命令(例如发送到 docker 的grails run-app --stacktracegrails dependency-report --stacktrace发送到 docker 的命令会失败并显示堆栈跟踪):

| 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:(在 RUN 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"]

设置:

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 客户端:版本:1.10.3 API 版本:1.22 Go 版本:go1.5.3 Git 提交:20f81dd 内置:2016 年 3 月 10 日星期四 15:54:52 OS/Arch:linux/amd64

4

8 回答 8

28

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

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

于 2016-04-27T15:28:01.507 回答
9

我用下一个修复它:

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

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

于 2017-03-08T16:52:12.033 回答
4

我已经通过删除build文件解决了这个问题。通过删除,然后再次运行它可能会解决此问题。

我选择只删除它,因为我什至无法调用 grails 函数。

您很可能已经登陆此页面,因为您在搜索引擎中搜索了错误并将您带到这里。

症状:当您在以前拥有的现有项目下运行“grails”时(在不同的 PC 上或从 GIT 或 SVN 等源代码控制,并且您错误地包含了“build”目录)。

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

于 2017-09-24T14:15:12.960 回答
2

对于有此问题的其他人,我只是删除(或者更确切地说移动以防万一我需要它回来)我的构建文件夹,然后再次运行,它重新下载了所有依赖项并立即工作

于 2016-12-10T12:51:57.807 回答
1

为了改善这种情况,您可以设置env var,这样您GRADLE_USER_HOME就不必每次运行 Docker 时都设置目录,就在第一次之前,实际上删除文件就可以了rmbuildbuild/.dependencies

VOLUME ["/gradle"]
ENV GRADLE_USER_HOME /gradle
于 2017-04-09T21:20:32.777 回答
1

./gradlew install对我来说,它通过在之后使用命令来 gradle clean工作grails

grails命令安装了依赖项并./gradlew install解决了所有后来的错误

于 2019-03-04T07:54:36.780 回答
0

我找到了答案。我不得不从 github 下载 grails 配置文件并将它们安装在 $GRAILS_HOME 中。我在 docker 文件中设置 Grails 环境变量后立即放置了这一步。

请参阅下面的示例 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
...
于 2016-04-09T04:04:48.907 回答
0

我从 Dockerfile 中删除了 RUN dependency-report,它解决了这个问题。

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

我不明白为什么在运行应用程序时需要网络配置文件。我认为配置文件规定了用于设置 grails 应用程序的模板。一旦完成,为什么在运行时需要它?究竟什么是“网络配置文件”。它是一个可以下载和添加的文件吗?

另一个奇怪的是,从 mozart/grails 创建的图像,带有 RUN 依赖报告,在 windows 的 docker 工具箱上运行良好,但在 docker for linux 上运行失败。我不明白相同的图像在不同的 docker 平台上会有不同的行为。我认为这就是码头工人的意义所在。

很抱歉在这里提供的问题多于答案,但希望能更好地理解所有这些。

于 2017-08-11T15:58:34.697 回答