ksaitoの日記

日々試したことの覚え書き

コンテナ起動時にシェルだけで、環境変数でファイルを書き換える

移転しました。

自動的にリダイレクトします。

コンテナ起動時にシェルだけで、環境変数でファイルを書き換える方法です。

下記のようなファイルを準備します。 ${VAL1}の部分を環境変数で書き換えます。

$ cat test.tmpl 
aaa
bbb
{${VAL1}}
ccc
$

下記のように、コンテナ起動時に-eオプションでVAL1に書き換えたい値を環境変数として、指定します。

$ docker run --rm -e VAL1="$(date)" -v .:/mnt --workdir /mnt nginx:1.17.4 /bin/bash -c 'eval "echo \"$(cat test.tmpl)\"" > /tmp/test.txt && cat /tmp/test.txt'
aaa
bbb
{2019年 10月 12日 土曜日 08:11:47 JST}
ccc
$

-v--workdirオプションは、今回の検証用でカレントディレクトリをマウントしましたが、コンテナに書き換えるファイルをCOPYすれば不要です。

書き換えの処理は、shbashevalを使います。

echoコマンドは、文字列の環境変数を置換してくれます。

$ echo $VAL1
okok
$ eval "echo \"$(cat test.tmpl)\""
aaa
bbb
{okok}
ccc
$

下記のようにテンプレートファイルとentrypoint用のシェルを準備します。

$ cat Dockerfile 
FROM nginx:1.17.4

COPY test.tmpl /mnt/test.tmpl
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
$ cat entrypoint.sh
#! /bin/bash

eval "echo \"$(cat /mnt/test.tmpl)\"" > /tmp/test.txt
cat /tmp/test.txt
$

下記のようにシェルだけで書き換えができました。

$ docker run -e VAL1="$(date)" --rm test /entrypoint.sh
aaa
bbb
{2019年 10月 12日 土曜日 08:43:05 JST}
ccc
$