DockerコンテナのIPを取得するためにエイリアスを作成しようとしています。コマンドは次のとおりです。
docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'
コマンドラインから起動すると正常に動作します。次に挿入しますbash_aliases
。
alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'"
ただし、起動時にredis-ip
次のエラーが発生します。
sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS
誰でもエラーが何であるかを教えてもらえますか?
答え1
これを行うには、エイリアスの代わりにシェル関数を使用してください。
function redis-ip {
docker inspect redis |
grep IPAddress |
awk 'NR == 3 { print $2 }' |
sed 's/[^"]*"\([^"]*\)".*/\1/'
}
必要に応じて動作する場合は、コマンドが何を出力するのかわからsed
ないので、わかりません。docker
答え2
問題は、エイリアスが"
二重引用符()で囲まれていることです。これはスクリプト$2
からawk
シェルではなくシェルに渡され、awk
コマンドの二重引用符がエイリアスをsed
混乱させることを意味します。これにより、エイリアスは期待どおりに機能するはずです。
alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{print \$2 }' | sed 's/[^\"]*\"\([^\"]*\)\".*/\1/'"
おそらく、より良いと簡単です。機能の使用しかし。
答え3
一般的に、「jsonからデータを解析または抽出するにはjqまたはjsonpipeなどを使用してください」と言いますが、コマンドにはすでに出力フォーマットとフィールドdocker inspect
抽出が組み込まれています。
docker inspect
興味のあるフィールドのみを返すように指示できます。
alias redis-ip="docker inspect -f '{{.NetworkSettings.IPAddress}}' redis"
または
alias redis-ip='docker inspect -f '\''{{.NetworkSettings.IPAddress}}'\'' redis'
これは(簡単に)に文書化されています。https://docs.docker.com/engine/reference/commandline/inspect/
また、見ることができます検査時に確認すべき事項詳細と例をご覧ください。そしてDocker検査テンプレートマジック出力形式を調べるDockerの可能性の良い概要といくつかの便利な例を含む別のブログ投稿です。