dockerfile变量值未传递到容器

时间:2018-06-20 15:37:53

标签: 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 = 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只是按原样附加。

2 个答案:

答案 0 :(得分:1)

    通过 ENTRYPOINT 在图像构建时运行时中可以访问
  • 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

答案 1 :(得分:0)

使用单引号可以阻止对环境变量进行插值。将双引号与-e的{​​{1}}标志一起使用(停止将换行符视为文字)。

echo

这对我来说非常有效。然后,我可以在Dockerfile中执行一个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 和一个RUN cat $KARAF_HOME/etc/org.ops4j.pax.logging.cfg,它显示了两者的以下输出(分别在构建时和运行时):

CMD cat $KARAF_HOME/etc/org.ops4j.pax.logging.cfg