ホストからdockerコンテナに環境変数経由でjsonデータを渡し、echoとリダイレクトでファイル化してアプリから読み込もうとした。
結果、以下のエラーが発生。
Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value
原因は、jsonの中に入っていた環境変数\n
を、shのcatでファイル化したこと。
shではなくbashにしたら解決した、という話。
shとbashの比較
ホストからコンテナに環境変数経由で\n
が入ったjson文字列を渡し、echoで表示してみる。
bashの場合
$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/bash
root@36d386fa2f27:/# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }
jsonとして正しいフォーマットを維持したままファイル化できる。
shの場合
$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/sh
# echo ${TEST}
{ "value":"hoge
huga
piyo" }
このままリダイレクトしてファイル化し、アプリを読み込むと、不適切な改行でエラーになる。
bashからshに切り替えても同じように壊れてしまうので、shは取り出すときに\n
をエスケープしてくれない様子。
$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/bash
root@3dd58b596f66:/# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }
root@3dd58b596f66:/# /bin/sh
# echo ${TEST}
{ "value":"hoge
huga
piyo" }
ちなみにCentOSの場合
$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it centos /bin/sh
sh-4.4# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }
CentOSであれば、shでも特に問題なくjsonが復元できる。
他にも、Debian系であってもイメージによっては普通に動いた。
変なところでハマってしまった。