Docker:在容器启动时更改文件中的单词

时间:2016-07-14 11:10:32

标签: docker fluentd

我正在为流利的人创建一个码头图片。 该图像包含一个名为http_forward.conf的文件 它包含:

<store>
   type http
   endpoint_url    ENDPOINTPLACEHOLDER
   http_method     post    # default: post
   serializer      json   # default: form
   rate_limit_msec 100    # default: 0 = no rate limiting
   raise_on_error  true  # default: true
   authentication  none  # default: none
   username        xxx  # default: ''
   password        xxx # default: '', secret: true
</store>

所以这是我们的形象。但我们希望将图像用于所有环境。用环境变量指定。

因此,我们为环境创建了一个环境变量:

ISSUE_SERVICE_URL = http://xxx.dev.xxx.xx/api/fluentdIssue

这个env变量包含dev开发环境,uat on uat等。 比我们想要用我们的env变量的值替换我们的ENDPOINTPLACEHOLDER。在bash中我们可以使用:

sed -i -- 's/ENDPOINTPLACEHOLDER/'"$ISSUE_SERVICE_URL"'/g' .../http_forward.conf

但是如果我们想在docker容器中使用它,我们如何/何时必须执行此命令? (我们不想挂载此文件)

2 个答案:

答案 0 :(得分:1)

我们是通过ansible编码完成的。

将文件http_forward.conf作为模板,根据环境部署更改,然后将文件夹(包括conf文件)挂载到docker容器。

ISSUE_SERVICE_URL = http://xxx.{{ environment }}.xxx.xx/api/fluentdIssue

剧本将是这样的,我不测试它。

- template: src=http_forward.conf.j2 dest=/config/http_forward.conf mode=0644

- docker:
      name: "fluentd"
      image: "xxx/fluentd"
      restart_policy: always
      volumes:
        - /config:/etc/fluent

答案 1 :(得分:0)

在你的DockerFile中,你应该有一个以CMD开头的行。你应该把它添加到那里。

或者你可以做得更干净:设置CMD线来调用脚本。例如CMD ./startup.sh。然后文件startup.sh将包含你的sed命令,然后是命令以启动你的流利(我假设它当前是CMD)。