我在AWS上有两个弹性beanstalk环境:开发和生产。我在每个实例上运行一个glassfish服务器,并且要求相同的应用程序包可以在生产环境和开发环境中部署,而不需要两个不同的文件。这两个实例大小不同:dev有一个微型实例,而生产有一个中等的实例,因此我需要为glassfish部署两个不同的配置文件,每个环境一个。EC2上的Docker,dockerfile中的RUN命令没有读取环境变量
主要的问题是该文件必须在服务器启动之前在glassfish config目录中,因此我认为在容器创建时移动它可能会更好。
当然,每个环境都使用docker容器来托管glassfish实例,所以我的第一个想法是为elastic-beanstalk配置一个环境变量。在这种情况下
ypenvironment = dev
的开发环境和
ypenvironment = pro
用于生产环境。然后在我的DOCKERFILE我把这种说法在运行命令:
RUN if [ "$ypenvironment"="pro" ] ; then \
mv --force /var/app/GF_domain.xml /usr/local/glassfish/glassfish/domains/domain1/config/domain.xml ; \
elif [ "$ypenvironment"="dev" ] ; then \
mv --force /var/app/GF_domain.xml.dev /usr/local/glassfish/glassfish/domains/domain1/config/domain.xml ; \
fi
不幸的是,当启动完成后,双方GF_domain文件仍在var/app
。
然后我发现RUN命令在容器完全加载之前运行了一些东西,可能缺少弹性beanstalk注入的变量。所以我试着将代码移动到ENTRYPOINT指令。再次运气不佳,容器启动失败。也试过
ENTRYPOINT ["command", "param"]
语法,但它没有工作给予
System error: exec: "if": executable file not found in $PATH
因此我坚持。
对不起,它不清楚,但两个不同的构建是我想要避免的。我需要能够为dev和pro环境使用相同的EAR包,但在elastic-beanstalk中,您只能部署EAR文件,而EAR文件又必须包含DOCKERFILE。也许有一种方法可以在运行docker build命令的上下文中获取环境变量值,但我不知道。我会尽快编辑我的问题,谢谢! – Gabber
@Gabber所以你说的是运行时,而不是构建时间(Dockerfile)? – VonC
@Gabber我编辑了我的答案,包括运行时语法 – VonC