dockerfile变量值未传递到容器

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

我有一个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 = 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