我在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