2019年7月12日金曜日

ruby (sinatra) で sitemap_generator を使ってみた

概要

sitemap_generator は ruby で sitemap.xml.gz が作成できるライブラリです
アクセスごとに生成するのではなく事前に生成してデプロイするタイプです
今回は普通に XML ファイルを生成する方法と Sinatra などの Web アプリ上に組み込む方法を検討してみました

環境

  • macOS 10.14.5
  • Ruby 2.6.2p47
    • sitemap_generator 6.0.2
    • sinatra 2.0.5

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "sitemap_generator"
  • bundle install --path vendor

普通に使ってみた

  • vim app.rb
require 'sitemap_generator'

SitemapGenerator::Sitemap.default_host = 'http://sample.local'
SitemapGenerator::Sitemap.create do
  add '/about', :priority => 0.8
  add '/apps', :changefreq => 'hourly', :priority => 0.8
  add '/blog', :changefreq => 'daily', :priority => 0.6
end
SitemapGenerator::Sitemap.ping_search_engines

ping_search_engines は主要なクローラ更新の ping を送信することができます

  • bundle exec ruby app.rb

public/sitemap.xml.gz が作成されます
中身を確認してみましょう

  • gzip -dc public/sitemap.xml.gz | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:pagemap="http://www.google.com/schemas/sitemap-pagemap/1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <url>
    <loc>http://sample.local</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>http://sample.local/about</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://sample.local/apps</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>hourly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://sample.local/blog</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.6</priority>
  </url>
</urlset>

lastmod はデフォルトだと生成した時間になります
changefreq はルートパスは always になります
それ以外は weekly がデフォルトになるようです
priority は指定がない場合 0.5 がデフォルトになります

Sinatra で使ってみた

  • vim Gemfile
gem "sitemap_generator"
gem "sinatra"
  • bundle install --path vendor
  • vim app.rb
require 'sitemap_generator'
require 'sinatra/base'

module Util
  Paths = [
    '/about' => {
      :priority => 0.8
    },
    '/apps' => {
      :changefreq => 'hourly',
      :priority => 0.8
    },
    '/blog' => {
      :changefreq => 'daily',
      :priority => 0.6
    }
  ]

  def self.sitemap
    SitemapGenerator::Sitemap.default_host = 'http://sample.local'
    SitemapGenerator::Sitemap.create do
      Paths.each do |path|
        path.each do |k, v|
          add k, v
        end 
      end
    end
    # SitemapGenerator::Sitemap.ping_search_engines
  end
end

class MyApp < Sinatra::Base
  Util::Paths.each do |path|
    path.keys.each do |p|
      get p do
        p
      end
    end
  end
end

Util.sitemap
  • vim config.ru
require './app.rb'
run MyApp
  • bundle exec ruby app.rb

public/sitemap.xml.gz が作成されます
そして

  • bundle exec rackup config.ru

でアプリが起動します
localhost:9292/about などにアクセスするとレスポンスが返ってきます

ポイントは require 'sinatra/base' すること
require 'sinatra' してしまうと 4567 で WEBrick が起動してしまいます

robots.txt は

ちゃんと .gz を付与しましょう

User-Agent: *
Allow: /
Sitemap: https://sample.local/sitemap.xml.gz

最後に

sitemap_generator を使ってみました
動的にレンダリングする機能はないので sitemap.xml を生成してからサイトにデプロイしましょう
Sinatra アプリなどですでにルーティングのパスを定義している場合はその情報を使って sitemap.xml を生成するようにすれば漏れはなくなると思います

ちゃんと作成できているか確認するには https://www.xml-sitemaps.com/ とかのサイトを使えば sitemap.xml を生成してくれるので比較してみると良いと思います

2019年7月11日木曜日

ターミナルなどの標準出力を HTML でキレイに見せる方法

概要

pretty-print の pre タグだけだとカラムになっている出力で横がうまく合いません
そんな場合に役立つ方法を紹介します

環境

  • macOS 10.14.5
  • terminal-to-html 3.2.0

terminal-to-html のインストール

terminal-to-html というコマンドを使います
ようするにコマンドを実行した結果を HTML に出力してくれるのでそれをブログなどに貼り付ける感じです

  • go get github.com/buildkite/terminal-to-html/cmd/terminal-to-html

HTML 出力

  • docker images | terminal-to-html --preview

こんな感じでパイプで使います
ファイルに落としたい場合はリダイレクトすれば OK です

  • docker images | terminal-to-html --preview > out.html

<html> タブから始まっていますが必要なのは <div class="term-container">...</div> の部分です

スタイルの適用

<style>...</style> も必要なので貼り付けます
Blogger であれば「テーマ」->「カスタマイズ」->「上級者向け」->「CSS を追加」で以下を追記しましょう

執筆時点で出力されている CSS を記載しています
バージョンが違うと出力される内容も異なる可能性があるのでその時点で出力される CSS を使ってください

/* for terminal-to-html */
.term-container {
  background: #171717;
  border-radius: 5px;
  color: white;
  word-break: break-word;
  overflow-wrap: break-word;
  font-family: Monaco, courier;
  font-size: 12px;
  line-height: 20px;
  padding: 14px 18px;
  white-space: pre-wrap;
}

.term-fg1 { } /* don't bold beccause it looks weird */
.term-fg3 { font-style: italic; } /* italic */
.term-fg4 { text-decoration: underline; } /* underline */
.term-fg9 { text-decoration: line-through; } /* crossed-out */

.term-fg30 { color: #666; } /* black (but we can't use black, so a diff color) */
.term-fg31 { color: #e10c02; } /* red */
.term-fg32 { color: #99ff5e; } /* green */
.term-fg33 { color: #c6c502; } /* yellow */
.term-fg34 { color: #8db7e0; } /* blue */
.term-fg35 { color: #f271fb; } /* magenta */
.term-fg36 { color: #00cdd9; } /* cyan */

/* high intense colors */
.term-fgi1 { color: #5ef765; }
.term-fgi90 { color: #838887; } /* grey */

/* background colors */
.term-bg42 { background: #99ff5f; }
.term-bg40 { background: #676767; }

/* custom foreground/background combos for readability */
.term-fg31.term-bg40 { color: #F8A39F; }

/* xterm colors */
.term-fgx16 { color: #000000; }
.term-fgx17 { color: #00005f; }
.term-fgx18 { color: #000087; }
.term-fgx19 { color: #0000af; }
.term-fgx20 { color: #0000d7; }
.term-fgx21 { color: #0000ff; }
.term-fgx22 { color: #005f00; }
.term-fgx23 { color: #005f5f; }
.term-fgx24 { color: #005f87; }
.term-fgx25 { color: #005faf; }
.term-fgx26 { color: #005fd7; }
.term-fgx27 { color: #005fff; }
.term-fgx28 { color: #008700; }
.term-fgx29 { color: #00875f; }
.term-fgx30 { color: #008787; }
.term-fgx31 { color: #0087af; }
.term-fgx32 { color: #0087d7; }
.term-fgx33 { color: #0087ff; }
.term-fgx34 { color: #00af00; }
.term-fgx35 { color: #00af5f; }
.term-fgx36 { color: #00af87; }
.term-fgx37 { color: #00afaf; }
.term-fgx38 { color: #00afd7; }
.term-fgx39 { color: #00afff; }
.term-fgx40 { color: #00d700; }
.term-fgx41 { color: #00d75f; }
.term-fgx42 { color: #00d787; }
.term-fgx43 { color: #00d7af; }
.term-fgx44 { color: #00d7d7; }
.term-fgx45 { color: #00d7ff; }
.term-fgx46 { color: #00ff00; }
.term-fgx47 { color: #00ff5f; }
.term-fgx48 { color: #00ff87; }
.term-fgx49 { color: #00ffaf; }
.term-fgx50 { color: #00ffd7; }
.term-fgx51 { color: #00ffff; }
.term-fgx52 { color: #5f0000; }
.term-fgx53 { color: #5f005f; }
.term-fgx54 { color: #5f0087; }
.term-fgx55 { color: #5f00af; }
.term-fgx56 { color: #5f00d7; }
.term-fgx57 { color: #5f00ff; }
.term-fgx58 { color: #5f5f00; }
.term-fgx59 { color: #5f5f5f; }
.term-fgx60 { color: #5f5f87; }
.term-fgx61 { color: #5f5faf; }
.term-fgx62 { color: #5f5fd7; }
.term-fgx63 { color: #5f5fff; }
.term-fgx64 { color: #5f8700; }
.term-fgx65 { color: #5f875f; }
.term-fgx66 { color: #5f8787; }
.term-fgx67 { color: #5f87af; }
.term-fgx68 { color: #5f87d7; }
.term-fgx69 { color: #5f87ff; }
.term-fgx70 { color: #5faf00; }
.term-fgx71 { color: #5faf5f; }
.term-fgx72 { color: #5faf87; }
.term-fgx73 { color: #5fafaf; }
.term-fgx74 { color: #5fafd7; }
.term-fgx75 { color: #5fafff; }
.term-fgx76 { color: #5fd700; }
.term-fgx77 { color: #5fd75f; }
.term-fgx78 { color: #5fd787; }
.term-fgx79 { color: #5fd7af; }
.term-fgx80 { color: #5fd7d7; }
.term-fgx81 { color: #5fd7ff; }
.term-fgx82 { color: #5fff00; }
.term-fgx83 { color: #5fff5f; }
.term-fgx84 { color: #5fff87; }
.term-fgx85 { color: #5fffaf; }
.term-fgx86 { color: #5fffd7; }
.term-fgx87 { color: #5fffff; }
.term-fgx88 { color: #870000; }
.term-fgx89 { color: #87005f; }
.term-fgx90 { color: #870087; }
.term-fgx91 { color: #8700af; }
.term-fgx92 { color: #8700d7; }
.term-fgx93 { color: #8700ff; }
.term-fgx94 { color: #875f00; }
.term-fgx95 { color: #875f5f; }
.term-fgx96 { color: #875f87; }
.term-fgx97 { color: #875faf; }
.term-fgx98 { color: #875fd7; }
.term-fgx99 { color: #875fff; }
.term-fgx100 { color: #878700; }
.term-fgx101 { color: #87875f; }
.term-fgx102 { color: #878787; }
.term-fgx103 { color: #8787af; }
.term-fgx104 { color: #8787d7; }
.term-fgx105 { color: #8787ff; }
.term-fgx106 { color: #87af00; }
.term-fgx107 { color: #87af5f; }
.term-fgx108 { color: #87af87; }
.term-fgx109 { color: #87afaf; }
.term-fgx110 { color: #87afd7; }
.term-fgx111 { color: #87afff; }
.term-fgx112 { color: #87d700; }
.term-fgx113 { color: #87d75f; }
.term-fgx114 { color: #87d787; }
.term-fgx115 { color: #87d7af; }
.term-fgx116 { color: #87d7d7; }
.term-fgx117 { color: #87d7ff; }
.term-fgx118 { color: #87ff00; }
.term-fgx119 { color: #87ff5f; }
.term-fgx120 { color: #87ff87; }
.term-fgx121 { color: #87ffaf; }
.term-fgx122 { color: #87ffd7; }
.term-fgx123 { color: #87ffff; }
.term-fgx124 { color: #af0000; }
.term-fgx125 { color: #af005f; }
.term-fgx126 { color: #af0087; }
.term-fgx127 { color: #af00af; }
.term-fgx128 { color: #af00d7; }
.term-fgx129 { color: #af00ff; }
.term-fgx130 { color: #af5f00; }
.term-fgx131 { color: #af5f5f; }
.term-fgx132 { color: #af5f87; }
.term-fgx133 { color: #af5faf; }
.term-fgx134 { color: #af5fd7; }
.term-fgx135 { color: #af5fff; }
.term-fgx136 { color: #af8700; }
.term-fgx137 { color: #af875f; }
.term-fgx138 { color: #af8787; }
.term-fgx139 { color: #af87af; }
.term-fgx140 { color: #af87d7; }
.term-fgx141 { color: #af87ff; }
.term-fgx142 { color: #afaf00; }
.term-fgx143 { color: #afaf5f; }
.term-fgx144 { color: #afaf87; }
.term-fgx145 { color: #afafaf; }
.term-fgx146 { color: #afafd7; }
.term-fgx147 { color: #afafff; }
.term-fgx148 { color: #afd700; }
.term-fgx149 { color: #afd75f; }
.term-fgx150 { color: #afd787; }
.term-fgx151 { color: #afd7af; }
.term-fgx152 { color: #afd7d7; }
.term-fgx153 { color: #afd7ff; }
.term-fgx154 { color: #afff00; }
.term-fgx155 { color: #afff5f; }
.term-fgx156 { color: #afff87; }
.term-fgx157 { color: #afffaf; }
.term-fgx158 { color: #afffd7; }
.term-fgx159 { color: #afffff; }
.term-fgx160 { color: #d70000; }
.term-fgx161 { color: #d7005f; }
.term-fgx162 { color: #d70087; }
.term-fgx163 { color: #d700af; }
.term-fgx164 { color: #d700d7; }
.term-fgx165 { color: #d700ff; }
.term-fgx166 { color: #d75f00; }
.term-fgx167 { color: #d75f5f; }
.term-fgx168 { color: #d75f87; }
.term-fgx169 { color: #d75faf; }
.term-fgx170 { color: #d75fd7; }
.term-fgx171 { color: #d75fff; }
.term-fgx172 { color: #d78700; }
.term-fgx173 { color: #d7875f; }
.term-fgx174 { color: #d78787; }
.term-fgx175 { color: #d787af; }
.term-fgx176 { color: #d787d7; }
.term-fgx177 { color: #d787ff; }
.term-fgx178 { color: #d7af00; }
.term-fgx179 { color: #d7af5f; }
.term-fgx180 { color: #d7af87; }
.term-fgx181 { color: #d7afaf; }
.term-fgx182 { color: #d7afd7; }
.term-fgx183 { color: #d7afff; }
.term-fgx184 { color: #d7d700; }
.term-fgx185 { color: #d7d75f; }
.term-fgx186 { color: #d7d787; }
.term-fgx187 { color: #d7d7af; }
.term-fgx188 { color: #d7d7d7; }
.term-fgx189 { color: #d7d7ff; }
.term-fgx190 { color: #d7ff00; }
.term-fgx191 { color: #d7ff5f; }
.term-fgx192 { color: #d7ff87; }
.term-fgx193 { color: #d7ffaf; }
.term-fgx194 { color: #d7ffd7; }
.term-fgx195 { color: #d7ffff; }
.term-fgx196 { color: #ff0000; }
.term-fgx197 { color: #ff005f; }
.term-fgx198 { color: #ff0087; }
.term-fgx199 { color: #ff00af; }
.term-fgx200 { color: #ff00d7; }
.term-fgx201 { color: #ff00ff; }
.term-fgx202 { color: #ff5f00; }
.term-fgx203 { color: #ff5f5f; }
.term-fgx204 { color: #ff5f87; }
.term-fgx205 { color: #ff5faf; }
.term-fgx206 { color: #ff5fd7; }
.term-fgx207 { color: #ff5fff; }
.term-fgx208 { color: #ff8700; }
.term-fgx209 { color: #ff875f; }
.term-fgx210 { color: #ff8787; }
.term-fgx211 { color: #ff87af; }
.term-fgx212 { color: #ff87d7; }
.term-fgx213 { color: #ff87ff; }
.term-fgx214 { color: #ffaf00; }
.term-fgx215 { color: #ffaf5f; }
.term-fgx216 { color: #ffaf87; }
.term-fgx217 { color: #ffafaf; }
.term-fgx218 { color: #ffafd7; }
.term-fgx219 { color: #ffafff; }
.term-fgx220 { color: #ffd700; }
.term-fgx221 { color: #ffd75f; }
.term-fgx222 { color: #ffd787; }
.term-fgx223 { color: #ffd7af; }
.term-fgx224 { color: #ffd7d7; }
.term-fgx225 { color: #ffd7ff; }
.term-fgx226 { color: #ffff00; }
.term-fgx227 { color: #ffff5f; }
.term-fgx228 { color: #ffff87; }
.term-fgx229 { color: #ffffaf; }
.term-fgx230 { color: #ffffd7; }
.term-fgx231 { color: #ffffff; }
.term-fgx232 { color: #080808; }
.term-fgx233 { color: #121212; }
.term-fgx234 { color: #1c1c1c; }
.term-fgx235 { color: #262626; }
.term-fgx236 { color: #303030; }
.term-fgx237 { color: #3a3a3a; }
.term-fgx238 { color: #444444; }
.term-fgx239 { color: #4e4e4e; }
.term-fgx240 { color: #585858; }
.term-fgx241 { color: #626262; }
.term-fgx242 { color: #6c6c6c; }
.term-fgx243 { color: #767676; }
.term-fgx244 { color: #808080; }
.term-fgx245 { color: #8a8a8a; }
.term-fgx246 { color: #949494; }
.term-fgx247 { color: #9e9e9e; }
.term-fgx248 { color: #a8a8a8; }
.term-fgx249 { color: #b2b2b2; }
.term-fgx250 { color: #bcbcbc; }
.term-fgx251 { color: #c6c6c6; }
.term-fgx252 { color: #d0d0d0; }
.term-fgx253 { color: #dadada; }
.term-fgx254 { color: #e4e4e4; }
.term-fgx255 { color: #eeeeee; }

比較してみる

あとは毎回 terminal-to-html でバイプした結果を貼り付ければ OK です
以下は pretty-print と比較した結果です
下の方がキレイかなと思います

pretty-print

  • docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
nginx                                           latest              f68d6e55e065        4 days ago          109MB
ruby-fndic-web_batch                            latest              d4b1c0e95fde        6 days ago          912MB
ruby-fndic                                      latest              875b076f1023        8 days ago          981MB
busybox                                         latest              e4db68de4ff2        3 weeks ago         1.22MB
zabbix/zabbix-agent                             latest              bc21cdfcc381        3 weeks ago         14.9MB
mysql                                           8.0                 c7109f74d339        3 weeks ago         443MB
docker.elastic.co/elasticsearch/elasticsearch   7.1.1               b0e9f9f047e6        6 weeks ago         894MB
ruby-fndb_test                                  latest              2e8ee6223dc4        6 weeks ago         1.36GB
selenium/standalone-firefox-debug               latest              abcae7c10c66        2 months ago        798MB
ruby                                            latest              f39c31795d25        2 months ago        870MB
redis                                           latest              0f55cf3661e9        4 months ago        95MB
fluent/fluentd                                  latest              9406ff63f205        6 months ago        38.3MB
monitoringartist/dockbix-agent-xxl-limited      latest              9e691ac476c0        21 months ago       43.7MB

terminal-to-html

  • docker images | terminal-to-html --preview
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB ruby-fndic-web_batch latest d4b1c0e95fde 6 days ago 912MB ruby-fndic latest 875b076f1023 8 days ago 981MB busybox latest e4db68de4ff2 3 weeks ago 1.22MB zabbix/zabbix-agent latest bc21cdfcc381 3 weeks ago 14.9MB mysql 8.0 c7109f74d339 3 weeks ago 443MB docker.elastic.co/elasticsearch/elasticsearch 7.1.1 b0e9f9f047e6 6 weeks ago 894MB ruby-fndb_test latest 2e8ee6223dc4 6 weeks ago 1.36GB selenium/standalone-firefox-debug latest abcae7c10c66 2 months ago 798MB ruby latest f39c31795d25 2 months ago 870MB redis latest 0f55cf3661e9 4 months ago 95MB fluent/fluentd latest 9406ff63f205 6 months ago 38.3MB monitoringartist/dockbix-agent-xxl-limited latest 9e691ac476c0 21 months ago 43.7MB

最後に

terminal-to-html を使ってターミナルの出力結果をキレイに見せる方法を紹介しました
コマンドの結果をパイプで食わせるだけなのでそこまで大変ではないかなと思います

2019年7月10日水曜日

docker Swarm で使える visualizer をサクっと使ってみた

概要

docker-swarm-visualizer は docker Swarm 用の管理 UI です
stack deploy を使っていれば docker-compose.yml に記載するだけで簡単に導入できます

環境

  • macOS 10.14.5
  • Vagrant 2.1.1
  • Ubuntu 16.04 LTS
  • docker 18.09.7

docker-compose.yml

version: '3.4'

services:
  redis:
    image: redis
    ports:
      - "6379:6379"
  nginx:
    image: nginx
    environment:
      DUDE: "{{.Node.Hostname}}"
    deploy:
      replicas: 3
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

テスト用にいくつかコンテナを立ち上げています
visualizer は必ず manager ノードで動作させる必要があります
visualizer の service をそのままコピペするれば動作します

  • docker stack deploy -c docker-compose.yml test

stack, service, ps 確認

  • docker stack ls
NAME                SERVICES            ORCHESTRATOR
test                3                   Swarm
  • docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
hgxr3sloz9kt        test_nginx          replicated          3/3                 nginx:latest                      
0ltzk5dou6f3        test_redis          replicated          1/1                 redis:latest                      *:6379->6379/tcp
owqk1g7ph5y0        test_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
  • docker stack ps test
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
0fmk68yi8i7b        test_nginx.1        nginx:latest                      vm01                Running             Running 8 minutes ago                       
v100ayawcz52        test_redis.1        redis:latest                      vm02                Running             Running 8 minutes ago                       
nxqykk8zicu4        test_visualizer.1   dockersamples/visualizer:stable   vm01                Running             Running 8 minutes ago                       
pc78wq565vyb        test_nginx.2        nginx:latest                      vm02                Running             Running 8 minutes ago                       
tlfofrea4ck2        test_nginx.3        nginx:latest                      vm02                Running             Running 8 minutes ago

iptables 確認

  • sudo iptables -nL DOCKER-INGRESS
Chain DOCKER-INGRESS (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED tcp spt:8080
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6379
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED tcp spt:6379
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

動作確認

manager のノードの IP の 8080 にアクセスしましょう
するとどのノードでどのコンテナが動作しているか確認することができます

ちなみに manager の IP は以下のコマンドで確認できます

  • docker node inspect self --format '{{ .Status.Addr }}'

参考サイト

2019年7月9日火曜日

docker-compose + fluentd driver のサンプル

概要

docker-compose で fluentd logging driver を使ったサンプルを紹介します

環境

  • macOS 10.14.5
  • docker for mac 18.09.2
  • docker-compose 1.23.2

サンプル

  • mkdir conf
  • vim conf/fluent.conf
<source>
  @type forward
</source>

<match docker.**>
  @type stdout
</match>
  • vim docker-compose.yml
version: '3.7'
services:
  logger:
    image: fluent/fluentd
    ports:
      - "24224:24224"
    volumes:
      - ./conf:/fluentd/etc
  web:
    image: nginx
    ports:
      - "80:80"
    logging:
      driver: fluentd
      options:
        fluentd-address: 192.168.99.1:24224
        tag: docker.container_1
    depends_on:
      - logger
  • docker-compose up -d

ポイント

  • 必ず host を経由して fluentd コンテナにアクセスしなければならない

fluentd-address: 192.168.99.1:24224 という感じで fluentd のエンドポイントを指定していますが例えばこれを fluentd-address: logger:24224 という感じで service 名にしてもエラーになります

  • fluent.conf がデフォルト別の名前の場合は FLUENTD_CONF という環境変数をセットすること

デプロイするパスは /fluentd/etc にしましょう

  • logging.options.tag の指定がない場合はデフォルトはホスト名が tag になる

fluent.conf の match タグで使うことになります
コンテナ名は指定しないと基本的にランダムな文字列になるので tag を指定しましょう

動作確認

  • docker-compose logs -f logger
  • curl localhost

で logger サービスのログに以下のように表示されれば OK です

logger_1  | 2019-07-02 11:03:36.000000000 +0000 docker.container_1: {"source":"stdout","log":"192.168.0.1 - - [02/Jul/2019:11:03:36 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.54.0\" \"-\"","container_id":"a091e2f50d1c9619ca50dae39b6d559c36cd7829dd48573f24a1040da9ae8d10","container_name":"/try_docker_compose_with_fluentd_web_1"}

ちなみに web サービス側のコンテナにはログが表示されなくなるので注意してください

2019年7月8日月曜日

docker-compose で環境変数を渡すいくつかの方法

概要

docker-compose 上で環境変数を扱う方法を紹介します
優先度などもあるのでその辺りの考慮が必要です

環境

  • macOS 10.14.5
  • docker for mac 18.09.2

docker

以下のコマンドを docker-compose 上で実現します

  • docker run --rm -e HOGE=hoge busybox /bin/sh -c "echo \$HOGE"

コンテナに渡した環境変数 HOGE を echo しているだけです
ちなみに \$ という感じでエスケープしないと現在のシェル上の HOGE 環境変数を参照してしまうので注意が必要です

environment を使う

まずは単純に environment を使ってみましょう
直接 YAML ファイルに記載する必要があります

  • vim docker-compose.yml
version: '3.7'
services:
  echo:
    image: busybox
    environment:
      - HOGE=hoge
    command:
      - "/bin/sh"
      - "-c"
      - "echo $$HOGE"
  • docker-compose up -d
  • docker-compose logs echo

=> hoge

environment は「コンテナに指定した環境変数を渡す」役割を担っています
このあと紹介する .env や shell 上の環境変数を使う方法とは少しレイヤーが違います
また docker-compose で $ をエスケープするのは $$ にすれば OK です

.env ファイルを使う

.env ファイルを作成すると「そのファイル内で定義した環境変数を docker-compose.yml ファイル内で参照」することができます
つまり .env ファイルを記載しただけではコンテナに環境変数を渡すことはできません
あくまでもコンテナ環境変数を渡すのは environment になります

  • vim .env
HOGE=hoge_in_env
  • vim docker-compose.yml
version: '3.7'
services:
  echo:
    image: busybox
    environment:
      - HOGE=$HOGE
    command:
      - "/bin/sh"
      - "-c"
      - "echo $$HOGE"
  • docker-compose up -d
  • docker-compose logs echo

=> hoge_in_env

という感じで .env ファイルに記載した値をコンテナに渡すことができます

shell 上の環境変数を使う

先程は .env ファイルに記載することで YAML ファイルに環境変数を渡しました
現在実行しているシェル上に環境変数を設定することで、それを docker-compose.yml 内で参照することもできます

.envdocker-compose.yml は先程と同じで以下のように実行してみましょう

  • HOGE=hoge_in_shell docker-compose up -d
  • docker-compose logs echo

=> hoge_in_shell

という感じで .env よりも優先して YAML ファイルで参照できていることがわかります

-e オプションはあるのか

例えば environment で定義していない環境変数をコンテナに渡したい場合にどうするかですが docker コマンド同様に -e オプションが使えます

ただ up コマンドではなく run コマンドを使います

  • vim docker-compose.yml
version: '3.7'
services:
  echo:
    image: busybox
    environment:
      - HOGE=$HOGE
    command:
      - "/bin/sh"
      - "-c"
      - "echo $$HOGE $$FUGA"

FUGA 環境変数も参照するように書き換えた上で以下のように echo コンテナを起動しましょう

  • docker-compose run -e FUGA=fuga echo

=> hoge_in_env fuga

すると environment で渡していない環境変数がコンテナに渡っていることが確認できます

まとめ

  • コンテナに環境変数を渡すのは environment or run -e を使う
  • docker-compose.yml に環境変数を渡すのは .env or 現在のシェルの環境変数を使う

という感じです
機能によって使うレイヤーが少し異なるのでそこの理解ができれば OK かなと思います