【问题标题】:Dockerfile: How to replace a placeholder in environment variable with build-arg's?Dockerfile:如何用 build-arg 替换环境变量中的占位符?
【发布时间】:2017-11-30 14:35:01
【问题描述】:

我有一个 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')替换像“PWD”这样的占位符

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

你知道我怎样才能完成这项工作吗?随意提出其他方法。我只是不想在我的 Dockerfile 中有硬编码的参数。

谢谢!

【问题讨论】:

    标签: bash docker sed terminal dockerfile


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的回答。不幸的是,您的解决方案不起作用...当我在容器创建后检查配置变量时,该字段看起来如下“用户名”:\“${USER}\”'
    • 谢谢,我有一个小错字,因此当我第一次尝试您的解决方案时它不起作用。您的解决方案有效,谢谢!
    猜你喜欢
    • 2020-10-16
    • 2014-12-09
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2018-04-27
    • 2021-09-15
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多