dockerfile变量值未传递到容器
我有一个Dockerfile,如下所示,它在org.ops4j.pax.logging.cfg文件中附加了一些行dockerfile变量值未传递到容器,docker,dockerfile,Docker,Dockerfile,我有一个Dockerfile,如下所示,它在org.ops4j.pax.logging.cfg文件中附加了一些行 FROM ubuntu:18.04 ENV DB_SERVER 1.1.1.1 ENV DB_SCHEMA mydb ENV DB_USER myuser ENV DB_PASSWORD mypass RUN /bin/echo $'log4j.appender.DB.URL = jd
FROM ubuntu:18.04
ENV DB_SERVER 1.1.1.1
ENV DB_SCHEMA mydb
ENV DB_USER myuser
ENV DB_PASSWORD mypass
RUN /bin/echo $'log4j.appender.DB.URL = jdbc:mysql://$DB_SERVER/$DB_SCHEMA\n\
log4j.appender.DB.user = $DB_USER\n\
log4j.appender.DB.password = $DB_PASSWORD\n'\
>> $KARAF_HOME/etc/org.ops4j.pax.logging.cfg
我希望上面的条目应该被附加到一个带有值的文件中,但echo只是按原样进行附加
ENV可以在映像构建时和运行时由入口点访问。
ARG可以在映像生成时访问,但不能在容器启动运行时访问。
因此,如果您希望在Dockerfile中访问,并且您的命令不是入口点,则应将其定义为ARG:
FROM ubuntu:18.04
ARG DB_SERVER=1.1.1.1
ARG DB_SCHEMA=mydb
ARG DB_USER=myuser
ARG DB_PASSWORD=mypass
RUN /bin/echo $'log4j.appender.DB.URL = jdbc:mysql://${DB_SERVER}/${DB_SCHEMA}\n\
log4j.appender.DB.user = ${DB_USER}\n\
log4j.appender.DB.password = ${DB_PASSWORD}\n'\
>> ${BPPM_HOME}/etc/org.ops4j.pax.logging.cfg
单引号的使用阻止了环境变量被插值。使用双引号和-e标志将其作为文本处理
FROM ubuntu:18.04
ENV DB_SERVER 1.1.1.1
ENV DB_SCHEMA mydb
ENV DB_USER myuser
ENV DB_PASSWORD mypass
RUN /bin/echo -e "log4j.appender.DB.URL = jdbc:mysql://$DB_SERVER/$DB_SCHEMA\n\
log4j.appender.DB.user = $DB_USER\n\
log4j.appender.DB.password = $DB_PASSWORD\n"\
>> $KARAF_HOME/etc/org.ops4j.pax.logging.cfg
这对我来说非常合适。然后,我可以在Dockerfile中运行cat$KARAF_HOME/etc/org.ops4j.pax.logging.cfg和CMD cat$KARAF_HOME/etc/org.ops4j.pax.logging.cfg,分别在构建和运行时显示以下输出:
log4j.appender.DB.URL = jdbc:mysql://1.1.1.1/mydb
log4j.appender.DB.user = myuser
log4j.appender.DB.password = mypass
您可以在任何喜欢的命令中访问ENV,包括RUN。这是我告诉您的,或者我尝试过的,这两个命令在构建时都是有效的,但更推荐ARG。@mulg0r for ARG it从守护进程引发错误响应:Dockerfile parse error line 6:ARG只需要一个参数。通过提供=在变量和值之间解决它。但还是要按照约翰哈里的方法去做你是对的,对不起,我忘了。我来编辑。无论如何,使用ENV时要小心,DB_密码可以在容器中访问,而不仅仅是在构建中。因此,建议使用ARG。不建议使用ENV,因为任何容器都可以访问它,而且所有容器都有DB_密码不是一个好的做法。这是一个安全问题。所以,除非是密码,否则应该使用ARG,而不是ENV。当然,但这和问题无关:p