<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>YAML on ゲンゾウ用ポストイット</title><link>https://genzouw.com/entry/category/yaml/</link><description>Recent content in YAML on ゲンゾウ用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sat, 06 May 2023 08:30:06 +0900</lastBuildDate><atom:link href="https://genzouw.com/entry/category/yaml/index.xml" rel="self" type="application/rss+xml"/><item><title>docker-compose.yamlのentrypoint/commandフィールドで環境変数を使いたい</title><link>https://genzouw.com/entry/2023/04/18/083045/3484/</link><pubDate>Tue, 18 Apr 2023 08:30:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/18/083045/3484/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; 内で環境変数を記述する際には、その展開時期に注意しましょう。&#10;&lt;code&gt;entrypoint&lt;/code&gt; や &lt;code&gt;command&lt;/code&gt; フィールドに環境変数を記述する場合には、&lt;code&gt;environment&lt;/code&gt; フィールドでの環境変数定義を参照できないため、別途工夫が必要です。&#10;また、&lt;code&gt;docker-compose up&lt;/code&gt; 実行時に、環境変数が「置換」される挙動については、使い方次第では不便な場合もあるため、注意が必要です。&lt;/p&gt;&#10;&lt;p&gt;問題点について、具体的なコードをあげて説明した後、対処法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Compose version v2.15.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="docker-composeyaml-に環境変数-var-を記述した時の挙動"&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; に環境変数 &lt;code&gt;$VAR&lt;/code&gt; を記述した時の挙動&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; には &lt;code&gt;$VAR&lt;/code&gt; あるいは &lt;code&gt;${VAR}&lt;/code&gt; の形式で環境変数を記述できます。&lt;/p&gt;&#10;&lt;p&gt;環境変数の展開の挙動を確認しておきます。&lt;/p&gt;&#10;&lt;p&gt;以下のような &lt;code&gt;docker-compose.yaml&lt;/code&gt; ファイルを用意します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bash&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;Z&amp;#34;: &lt;/span&gt;&lt;span class="l"&gt;genzouw&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;echo &amp;#34;$X&amp;#34;,&amp;#39;$Y&amp;#39;,&amp;#34;$Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;YAML ファイルを配置しているディレクトリで、以下のコマンドを実行することで Docker Compose 内に記述されているイメージを使ってコンテナが立ち上がります。&lt;/p&gt;</description></item><item><title>YAMLの重複記述を減らしDRYを保つためにエイリアス機能を使う</title><link>https://genzouw.com/entry/2021/06/19/082626/2661/</link><pubDate>Sat, 19 Jun 2021 08:26:26 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/19/082626/2661/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕が YAML ファイルを触りだしたのは、Ansible を使い始めてからでした。&lt;/p&gt;&#10;&lt;p&gt;そこから &lt;strong&gt;Docker Composes&lt;/strong&gt; 、 &lt;strong&gt;Kubernetes&lt;/strong&gt; ともはや YAML を触ることがないシステムはない状況となりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt; や &lt;strong&gt;GCP&lt;/strong&gt; 、 &lt;strong&gt;Azure&lt;/strong&gt; といったクラウド環境でも YAML ファイルで設定するリソースは非常に多いですし、Rest API のインターフェイス定義として &lt;strong&gt;OpenAPI&lt;/strong&gt; を YAML で記述します。&lt;/p&gt;&#10;&lt;p&gt;YAML ファイルの重要性が高まるにつれて、ファイルの内容はどんどん肥大化する傾向にあります。&#10;同時に 1 つの YAML ファイルの中に記述する内容が重複することも多く（Kubernetes マニフェストのラベル名など）、なんとか &lt;strong&gt;DRY&lt;/strong&gt; に記述できないかと悩むことがあります。&lt;/p&gt;&#10;&lt;h2 id="重複記述を回避するために-エイリアス-を使う"&gt;重複記述を回避するために &amp;ldquo;エイリアス&amp;rdquo; を使う&lt;/h2&gt;&#10;&lt;p&gt;そこで有効なのが YAML の標準機能として提供されている &lt;strong&gt;エイリアス&lt;/strong&gt; 機能です。&lt;/p&gt;&#10;&lt;p&gt;現在担当してるシステムのローカル開発環境は &lt;strong&gt;Docker Compose&lt;/strong&gt; を使って構築していますが、エイリアス機能を使って &lt;code&gt;docker-compose.yaml&lt;/code&gt; ファイルの簡素化を行っています。&lt;/p&gt;&#10;&lt;p&gt;それでは、エイリアス機能について見ていきましょう。&lt;/p&gt;&#10;&lt;h2 id="エイリアス別名機能とは"&gt;エイリアス(別名)機能とは？&lt;/h2&gt;&#10;&lt;p&gt;YAML のエイリアス機能とは、 &lt;strong&gt;単一の値&lt;/strong&gt; か &lt;strong&gt;ブロック(YAML のツリー構造)&lt;/strong&gt; のどちらかに名前をつけて、あとから参照するための仕組みになります。&lt;/p&gt;&#10;&lt;h2 id="エイリアス機能を利用した例"&gt;エイリアス機能を利用した例&lt;/h2&gt;&#10;&lt;h3 id="値にエイリアスを設定し参照する"&gt;値にエイリアスを設定し、参照する&lt;/h3&gt;&#10;&lt;p&gt;値に名前をつけるというのが最もシンプルな使い方です。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;amp;エイリアス名&lt;/code&gt; で名前をつけ、 &lt;code&gt;*エイリアス名&lt;/code&gt; で値を参照します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;new_greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;room&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;正しく値が参照できているかを確認するために、 &lt;a href="https://github.com/mikefarah/yq"&gt;yq&lt;/a&gt; というコマンドラインから YAML ファイルを操作するツールを使ってみます。&lt;/p&gt;</description></item></channel></rss>