Dockerfile:如何用build-arg替换环境变量中的占位符?

时间:2017-06-27 13:46:56

标签: bash docker sed terminal dockerfile

我有一个Web应用程序,我想在Docker上运行以进行测试。 应用程序使用数据库作为存储,并且数据库的配置在环境变量(JSON)中维护。 您可以在下面看到我的Dockerfile中的env变量定义(另请参阅下面的方法)

ENV CONFIG '{  \
  "credentials":{    \
      "hostname": "172.17.0.5",  \
      "password": "PWD", \
      "port": "1234", \
      "username": "${USER}"  \
     },  \
     "name":"database",  \
     "tags":[]  \
  },  \
...

如果我对数据库的所有参数进行硬编码,一切正常,但我不想仅仅因为数据库的IP地址发生变化而改变我的Dockerfile。 因此我想使用Docker build-args 我已经尝试了两种方法:

  1. 直接引用变量(请参阅“$ {USER}”行)
  2. 使用以下命令RUN CONFIG=$(echo $CONFIG | sed 's/PWD/'$db_pwd'/g')
  3. 替换“PWD”之类的占位符

    第一种方法无法替换,因此$ {USER}为$ {USER}。第二种方法似乎有效(至少在终端中),但似乎变量赋值不起作用。

    你知道我怎么能做这个工作吗?随意建议其他方法。我只是不想在我的Dockerfile中使用硬编码参数。

    谢谢!

1 个答案:

答案 0 :(得分:3)

变量扩展只能在双引号字符串中使用。这是有效的:

ENV CONFIG "{  \
  \"credentials\":{    \
      \"hostname\": \"172.17.0.5\",  \
      \"password\": \"PWD\", \
      \"port\": \"1234\", \
      \"username\": \"${USER}\"  \
     },  \
     \"name\":\"database\",  \
     \"tags\":[]  \
  }"

一个简单的例子:

FROM alpine

ENV USER foo
ENV CONFIG "{  \
  \"credentials\":{    \
      \"hostname\": \"172.17.0.5\",  \
      \"password\": \"PWD\", \
      \"port\": \"1234\", \
      \"username\": \"${USER}\"  \
     },  \
     \"name\":\"database\",  \
     \"tags\":[]  \
  }"

ENTRYPOINT env | sort

_

$ docker build -t test .
$ docker run -it --rm test
CONFIG={    "credentials":{          "hostname": "172.17.0.5",        "password": "PWD",       "port": "1234",       "username": "foo"       },       "name":"database",       "tags":[]    }
HOME=/root
HOSTNAME=43d29bd12bc5
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
TERM=xterm
USER=foo