2015年10月15日木曜日

Dockerfile ビルド時間短縮 tips

ubuntu や centos などの dockerhub イメージを使って Dockerfile を書くとき、大抵の場合 apt-get update や yum update を先頭に書きます。

FROM ubuntu:latest
RUN apt-get update && apt-get -y upgrade && apt-get clean

毎回たくさんのダウンロードが実行される時間を省略するために以下をやっておきます。

ホストOS 上で docker run
$ docker run -it --name t1 ubuntu:latest 
コンテナで apt-get update など実行して exit
# apt-get update && apt-get -y upgrade && apt-get clean
# exit
同じ名前でイメージ作成
$ docker commit t1 ubuntu:latest ← 同じ名前でイメージ更新
$ docker rm t1 ← 仮コンテナを削除
これで Dockerfile の FROM はいじらずにビルド時間を短縮できます。

2015年4月22日水曜日

技術ネタは Qiita とここで 2重投稿してみる

mysql の procedure(プロシージャ)で add partition

サンプルテーブル log。主キーは id 一つ。
create table log (
    id              bigint          not null auto_increment,
    message         text            ,
    created_at      int             not null,
    primary key (id)
) engine = InnoDB;
このままだとパーティション作成できないので主キーをいじる
alter table log
    modify id bigint not null,
    drop primary key;
alter table log
    add primary key (id, created_at),
    modify id bigint not null auto_increment;
パーティションを 1つ追加しとく。
alter table log partition by range (created_at) (
    partition pmin values less than (0)
);
プロシージャを作って 3年分のパーティション追加。
drop procedure if exists add_monthly_partition;
delimiter //
create procedure add_monthly_partition(
    in table_name text,
    in date_func text,
    in years int)
begin
    select now() into @d;
    select date_add(@d, interval years year) into @last;

    while @d < @last do
        select concat(
            'alter table ', table_name,
            ' add partition (partition p',
            date_format(@d, '%Y%m'),
            ' values less than (', date_func, '(''',
            date_format(@d, '%Y-%m-01'), ''')))'
        ) into @ddl;
        select @ddl;
        prepare stmt from @ddl;
        execute stmt;
        deallocate prepare stmt;
        select date_add(@d, interval 1 month) into @d;
    end while;
end //
delimiter ;

call add_monthly_partition('log', 'unix_timestamp', 3);