Grails 3.1.4 和 Docker - grails 命令返回“No profile found for name web”
Posted
技术标签:
【中文标题】Grails 3.1.4 和 Docker - grails 命令返回“No profile found for name web”【英文标题】:Grails 3.1.4 and Docker - grails commands return "No profile found for name web" 【发布时间】:2016-07-29 19:32:58 【问题描述】:我有一个简单的 grails 应用程序,它本身运行良好。使用带有grails run-app
的grails web profile没有问题
但是,当我从应用程序中构建 docker 映像时,发送到 docker 的 grails 命令(例如 grails run-app --stacktrace
或 grails dependency-report --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 构建命令: 从 grails 应用程序的根目录运行。 用户在 docker 组中。
docker build -t mygrailsapp .
Docker 文件: (在 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 摇篮 2.12
码头工人 客户: 版本:1.10.3 API版本:1.22 围棋版本:go1.5.3 Git 提交:20f81dd 建成时间:2016 年 3 月 10 日星期四 15:54:52 操作系统/架构:linux/amd64
【问题讨论】:
添加--verbose
后会发生什么?
我已经尝试过 --verbose。不幸的是,它没有添加任何新信息。
【参考方案1】:
当我将使用 web
配置文件的 Grails 3.1.4 应用程序移动到新机器时,我遇到了同样的问题。
在我的应用程序根目录中执行 gradle clean
会触发 Grails Maven 依赖项被下载,然后grails
命令开始工作。
【讨论】:
windows10环境下,grails 3.1.6,正确的命令是./gradlew clean
哦,gradlew
命令运行本地 Gradle 包装器,而 gradle
运行 Gradle 二进制文件(如果在 $PATH
上可用)。【参考方案2】:
我用下一个修复它:
-
删除(或重命名)
.gradle
目录
删除(或重命名)gradle
目录
删除(或重命名)build
目录
现在,我可以使用grails run-app
运行应用程序。
【讨论】:
我有No profile found for name [web]
,但删除后我又回到了java.lang.ClassCastException: jdk.internal.loader.ClassLoaders$AppClassLoader (in module: java.base) cannot be cast to java.net.URLClassLoader (in module: java.base)
【参考方案3】:
我已经通过删除build
文件解决了这个问题。删除 ,再运行可能会解决这个问题。
我选择只删除它,因为我什至无法调用 grails 函数。
您很可能已登陆此页面,因为您在搜索引擎中搜索了错误并将您带到这里。
症状:当您在以前拥有的现有项目下运行“grails”时(在不同的 PC 上或来自 GIT 或 SVN 等源代码控制,并且您错误地包含了“build”目录)。
请参考这个https://mythinkpond.com/2016/11/29/grails-no-profile-found-for-name-web-illegalstateexception/
【讨论】:
当提供这样的建议时,请告诉我们您为什么认为它会解决问题。 @KalaBalik 嗨,kala,我认为提供链接就足够了。感谢您的评论,我会努力让它成为一个好习惯。谢谢队友(顺便说一句,我已经更新了我的答案) 感谢您提供更多信息。这可能对某人有所帮助,但是,如果您没有得到原始提问者的太多关注,请不要失望,因为这个问题是一年半前提出的。【参考方案4】:对于遇到此问题的其他人,我只是删除(或者移动以防万一我需要它回来)我的构建文件夹,然后再次运行,它重新下载了所有依赖项并立即工作
【讨论】:
【参考方案5】:对我来说,它在gradle clean
和grails
之后使用命令./gradlew install
起作用
grails
命令安装了依赖,./gradlew install
解决了后面的所有错误
【讨论】:
【参考方案6】:为了改善这种情况,您可以设置 GRADLE_USER_HOME
env var,这样您就不必每次运行 Docker 时都在 rm
你 build
目录,就在第一次之前,实际上是删除 @987654324 @文件可以解决问题
VOLUME ["/gradle"]
ENV GRADLE_USER_HOME /gradle
【讨论】:
【参考方案7】:我找到了答案。我不得不从 github 下载 grails 配置文件并将它们安装在 $GRAILS_HOME 中。我在 docker 文件中设置好 Grails 环境变量后立即放置了这一步。
请参阅下面的示例 docker 文件 sn-p:
...
# 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
...
【讨论】:
grails 仍然抛出No profile found for name [angular]
。有没有办法“刷新”个人资料?我使用this 基本图像。
This 处理我的问题。
当我尝试将 grails 与错误版本的 vaadin 插件一起使用时收到错误消息(对于 grails 3.1,我使用 8:0.3 而不是 8:0.2)【参考方案8】:
我从 Dockerfile 中删除了 RUN 依赖项报告,它解决了这个问题。
但是,这意味着依赖项不再安装到映像中,必须在首次创建容器时下载。不是理想的情况。
我不明白为什么在运行应用程序时需要网络配置文件。我认为配置文件规定了用于设置 grails 应用程序的模板。一旦完成,为什么在运行时需要它?究竟什么是“网络配置文件”。它是一个可以下载和添加的文件吗?
另一个奇怪的是,从 mozart/grails 创建的图像,带有 RUN 依赖报告,在 windows 的 docker 工具箱上运行良好,但在 docker for linux 上运行失败。我不明白相同的图像在不同的 docker 平台上会有不同的行为。我认为这就是 docker 的意义所在。
很抱歉在这里提供的问题多于答案,但希望能更好地理解所有这些。
【讨论】:
以上是关于Grails 3.1.4 和 Docker - grails 命令返回“No profile found for name web”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 docker 容器中运行 grails-vue 配置文件?