20191011のdockerに関する記事は9件です。

DockerのLinux OSイメージにあるコマンド一覧を出す

動機

Dockerを使ってみようと思っていろいろ調べていると、イメージを作成するには、ベースとなるOSのイメージに対して、いろいろとファイルを追加していく所作をDockerfileに記述するそうなのですが、そこで「べースとなるOSにあらかじめ導入されているコマンドは何か?」という素朴な疑問が湧きます。

原始的な方法でいいではないか

調べたいイメージを走らせてfindでリストする、という原始的な方法を使ってみた。下記は公式のCentos8のパスにあるコマンド一覧を表示させた例。

centos8の実行例
% docker run -it --rm centos:8 /bin/bash -c 'find ${PATH//:/ } -type f -perm /0100 | sort'
/usr/bin/[
/usr/bin/addr2line
/usr/bin/alias
/usr/bin/ar
...(途中略)...
/usr/sbin/weak-modules
/usr/sbin/wipefs
/usr/sbin/zdump
/usr/sbin/zic
/usr/sbin/zramctl

バリエーション

上記実行例では、GNUのfindが入っていることを仮定している。BSD系のfindが入っているOSイメージの場合には、findのオプションを-perm /0100から-perm -0100に変える必要があるのではないかと思う。また、そもそもOSイメージにfindが入っていなかったら使えない方法ではある。

応用

同様の方法で、もともとインストールされているパッケージの一覧も表示させてみた。下記の例はRedHat系Linux想定して、host OSでソート。

応用例
% docker run -it --rm centos:8 rpm -qa | sort
acl-2.2.53-1.el8.x86_64
audit-libs-3.0-0.10.20180831git0047a6c.el8.x86_64
basesystem-11-5.el8.noarch
bash-4.4.19-7.el8.x86_64
bind-export-libs-9.11.4-16.P2.el8.x86_64
...(途中略)...
vim-minimal-8.0.1763-10.el8.x86_64
xz-5.2.4-3.el8.x86_64
xz-libs-5.2.4-3.el8.x86_64
yum-4.0.9.2-5.el8.noarch
zlib-1.2.11-10.el8.x86_64
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker環境構築】PHP5.3.3 + Apache + MySQL + phpMyAdminにFuelPHPをインストール

概要

既存の社内システム改修をする必要があり、PHP5.3.3、FuelPHP 1.7.2 1.7.3、Apache、MySQLという構成で、Dockerで環境構築を行いました。

調べたところPHP5.3.3は2010年頃にリリースされたらしくかなりレガシーなバージョンになるようで、記事があまり見つからない中のDocker環境構築は大変でした(最終的には色々な記事を参考になんとか構築できました・・・)。

自分が1から再構築できるようにDockerfile、docker-compose.ymlの解説や手順等を改めてまとめておこうと思います。

先に下記の先人のおかげでこの構成ができたことを感謝申し上げます!
自分の記事は先人の記事をほぼ組み合わせた感じになります。

PHP5.3.3環境を2017年に用意する方法 - Qiita
docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築 - Qiita
Docker 仮想CentOS6を動かす - @//メモ

ディレクトリ構成と手順

すぐ動かしたい方は、本記事と同じ構成のものをGithubに上げているのでそちらをご覧ください。本記事では、この構成を作成するまでの流れをやっていきます

追記情報は最後の方で確認してください

├─docker
│  ├─httpd
│  │  └─httpd.conf
│  └─php
│     ├─Dockerfile
│     └─php.ini
└─docker-compose.yml

docker-compose.yml

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

docker/httpd/httpd.conf

httpd.conf
~~長いので省略~~

初期設定からの変更点①
#ServerName www.example.com:80
↓
ServerName www.example.com:80

初期設定からの変更点②
DocumentRoot "/var/www/html"
↓
DocumentRoot "/app"

docker/php/Dockerfile

Dockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd && \
    yum clean all

RUN mkdir /app
WORKDIR /app

EXPOSE 80

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

docker/php/php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

PHP5.3.3が動く環境を用意する

PHP5.3.3をまずインストールしなけなればいけません。
自分はすんなり@suinさんの記事をすぐに見つけられたので幸運です。
PHP5.3.3環境を2017年に用意する方法 - Qiita

うまくいった方法はCentOS 6.9でyum install phpすること。なんとRedHatは未だにPHP5.3をサポートしている。

一応、まだ過去バージョンで5.3.3もインストールできるみたいでした(僕は試していませんが…)。
PHP: Releases
windows.php.net - /downloads/releases/archives/
参考:旧バージョンのPHPをダウンロードする方法 | jMatsuzaki

CentOS 6.9のDockerイメージダウンロード

CentOS 6.9でphp5.3がインストールできるみたいなので、CentOS 6.9のイメージからコンテナを起動してコンテナ内でphpのインストールを試して、上手く行ったらDockerfileに記載していくという方法でやってみます。

CentOS 6.9をインストールするDockerfileを用意

Dockerfile
FROM centos:6.9

CentOS 6.9のDockerイメージをビルド

用意したら、Dockerfileがあるディレクトリに移動後、イメージをビルドします。

$ docker build .

ビルドされるとエラーが表示されました。

SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All
files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to
double check and reset permissions for sensitive files and directories.
セキュリティ警告:WindowsからWindows以外のDockerホストに対してDockerイメージを構築しています。すべて
ビルドコンテキストに追加されたファイルとディレクトリには、「-rwxr-xr-x」権限が付与されます。お勧めです
機密性の高いファイルとディレクトリのアクセス許可を再確認してリセットします。

windowsからwindows以外のイメージを作成したため、パーミッションの警告のようです。とりあえず今回は無視します。

イメージの確認

確認できました。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              6.9                 2199b8eb8390        7 months ago        195MB

コンテナ起動

イメージ名を指定して、コンテナを起動しログインします。

$ docker run -it centos:6.9 /bin/bash

コンテナでphpインストールまで

ログインしたら、環境変数を設定します。

$ export PHP_VERSION=5.3.3
$ echo $PHP_VERSION
=> 5.3.3

phpをインストールします。

$ yum install -y php

phpのバージョン確認。php5.3.3がインストールされました!

$ php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

あとは必要なモジュールを同じように確認しながらインストールしていきます(モジュールは環境に応じて適宜インストール。zip、unzip、git、httpdはFuelPHPを使う際に必須でした。ないとエラーが出ます。)。

$ yum install -y php-mbstring
$ yum install -y php-pgsql
$ yum install -y php-mysql
$ yum install -y php-gd
$ yum install -y zip
$ yum install -y unzip
$ yum install -y git
$ yum install -y httpd

Apacheが起動するか確認

コンテナにログインした状態で作業を続けます。

$ /usr/sbin/apachectl -DFOREGROUND

ServerNameのエラーが出ると思いますがここでは無視します。
Enterを押して、うごけばとりあえずOKです。

確認したら、Ctrl + Cで起動を停止します。

コンテナでの作業は終わりですので、Ctrl + Dで抜けておきましょう。

動作確認したコマンドをDockerfileに反映

先程、コンテナで実際に入力したコマンドをDockerfileを反映すると下記のようになります。

完成したDockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd && \
    yum clean all

RUN mkdir /app
WORKDIR /app

EXPOSE 80

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

先程のコンテナ時点でなかったものがあると思います。
そちらの説明です。

yum clean allはDockerイメージの容量を減らすためのよくあるTIPSらしいです。

RUN mkdir /app WORKDIR /appはappフォルダを作成して、作業フォルダをappに指定しています。のちほど、appフォルダにfuelphpのファイルを展開するときに必要になります。

EXPOSE 80は、コンテナのポート80番を使うよみたいな感じです。実際にポートが公開されるわけではなさそうです。わかりやすいように明示しておきます。

再度、ビルドを行いApacheが起動することを確認する

ここは一気にやってしまいましょう。

# ビルド時にイメージ名をつける
$ docker build -t cnetos_php:6.9 .

# -p: ホストのポート8080 を コンテナのポート 80 にバインド(割り当て)します。
# -d: バックグラウンドで起動
$ docker run -p 8080:80 -d cnetos_php:6.9

# コンテナが起動していることを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
a9337cd1cef7        cnetos_php:6.9      "/usr/sbin/apachectl…"   7 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   inspiring_ride

http://localhost:8080/ にアクセス。

以下の画面が表示されていれば成功です!
image.png

起動が確認できたら、コンテナを停止しておきます。

docker stop コンテナ名またはコンテナID

php用のdocker-compose.ymlを用意

最終的にはdocker-compose up -dで一発起動するようにするので、docker-compose.ymlを作っていきます。

ディレクトリ構成

まず、以下のようなディレクトリ構成にします。

作成したDockerfileはdocker/php配下に配置してください。
ないフォルダは作成してください。
その他のファイルは次で説明します。

├─docker
│  ├─httpd
│  │  └─httpd.conf
│  └─php
│     ├─Dockerfile
│     └─php.ini
└─docker-compose.yml

docker-compose.yml

docker-compose.ymlは以下の通りです。

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80

サービス名はphpにしています。

buildでは、./docker/php/Dockerfileを指定。

volumesでは、dockerフォルダのphp.iniとhttpd.confの設定をコンテナに反映し、コンテナのappフォルダをマウントしホストから今後ファイル編集できるようにしています。

portsでは、ホストのポート8080番とコンテナのポート80番をつなげています。

これでホストの http://localhost:8080/ にアクセスすると、コンテナの80番に転送され、/appの内容が表示されます(documentrootはhttpd.confで設定しています)。

php.ini

php.iniは以下の通りです。

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

httpd.conf

httpd.confは、コンテナ内部からhttpd.confファイルをコピーしてきます。

# コピーするには「docker cp」コマンドを使用します。
# 引数は「コンテナID:コンテナパス ローカルパス」と指定します。

$ docker cp コンテナID:/etc/httpd/conf/httpd.conf docker/httpd/

コピーできたら、下記の部分を変更します。
httpd.confの変更点は以下の通りです。

httpd.conf
~~長いので省略~~

初期設定からの変更点①
#ServerName www.example.com:80
↓
ServerName www.example.com:80

初期設定からの変更点②
DocumentRoot "/var/www/html"
↓
DocumentRoot "/app"

php用のdocker-compose.ymlを起動

先程のdocker-compose.ymlをもとに、ビルドして起動します。

docker-compose build
docker-compose up -d

http://localhost:8080/ にアクセスすると、Apacheの画面が表示されると思います。

ホストのfuel-app/の中にindex.phpを作って、再度アクセスしてみましょう。

index.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>php5.3.3-apache</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<?php phpinfo(); ?>
</body>
</html>

以下の画面が表示されたら、成功です!

image.png

コンテナは止めておきましょう。

docker-compose stop

ここまでで、PHP5.3.3とApacheの環境ができました。

残るMySQLとphpMyAdminが動く環境を用意する。

残りのMySQLとphpMyAdminはどちらとも公式イメージを使うので、docker-compose.ymlで完結します。

MySQLのdocker-compose.yml

以下の内容を追加するだけです。

docker-compose.yml
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test

imageは、公式のイメージを使用しています。

volumesは、コンテナの/var/lib/mysqlにMySQLな大事な設定ファイルが入るのでそれをホスト側で見れるにしています。また、コンテナを停止してもvolumesは削除しない限り消えないので、データが永続化されます。

environmentでは、環境変数を設定しています。意味は、docker hubを見るとわかりやすいです。

mysql - Docker Hub

これで、docker-compose up -dすると、mysqlコンテナが出来上がります。
コンテナログイン後、mysql -uroot -prootでmysqlにログインできます。

phpmyadminのdocker-compose.yml

以下の内容を追記するだけです。

docker-compose.yml
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions

imageは、公式のイメージを使っています。

environmentでは、環境変数を設定しています。これもdocker hubを見るとわかりやすいです。

phpmyadmin/phpmyadmin - Docker Hub

これで、docker-compose up -dして、http://localhost:4040/ にアクセスするとphpMyAdminが開きます!

image.png

最終的なdocker-compose.yml

最終的には下記のようになります。

docker-compose up -dして正常に動くか確認してみてください。

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

FuelPHPをインストールしてFuelPHPの画面を表示するまでの流れ

GitHubのREADME.mdに詳しく書いてあるのでそちらを参照してください。

さいごに

ここまでくるのに約2日かかりました。。
fuelphp自体が初めてで、何が必要か理解するまでに時間がかかりました。

fuelphpのインストールをシェルスクリプトで完結させたり、httpd.confをわざわざ2回修正したり(documentrootは存在しているディレクトリである必要がある)しているので、もうすこしいい感じにできたらしたいなーと思います。

あと、正直なところがっつりfuelphpで動かしてみていないのでMySQLの連携はこれで大丈夫か心配だったりします。

とりあえずfuelphpのチュートリアルをいくつかやってみて不具合があれば修正していきます。

追記:2019年10月13日

phpコンテナで php oil refine migrate でマイグレーションを実行するとエラーになる。
原因は、phpコンテナとmysqlコンテナはつながっていないため、
phpコンテナから /var/lib/mysql/mysql.sock を見に行ってもないと怒られていた。

Uncaught exception Fuel\Core\Database_Exception: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Callstack: 
#0 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(193): Fuel\Core\Database_PDO_Connection->connect()
#1 /app/fuel-app/fuel/core/classes/database/query.php(305): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
#2 /app/fuel-app/fuel/core/classes/dbutil.php(644): Fuel\Core\Database_Query->execute(NULL)
#3 /app/fuel-app/fuel/core/classes/migrate.php(608): Fuel\Core\DBUtil::table_exists('migration')
#4 /app/fuel-app/fuel/core/classes/migrate.php(74): Fuel\Core\Migrate::table_version_check()
#5 [internal function]: Fuel\Core\Migrate::_init()
#6 /app/fuel-app/fuel/core/classes/autoloader.php(375): call_user_func('Migrate::_init')
#7 /app/fuel-app/fuel/core/classes/autoloader.php(249): Fuel\Core\Autoloader::init_class('Migrate')
#8 [internal function]: Fuel\Core\Autoloader::load('Migrate')
#9 /app/fuel-app/fuel/core/tasks/migrate.php(235): spl_autoload_call('Migrate')
#10 /app/fuel-app/fuel/core/tasks/migrate.php(161): Fuel\Tasks\Migrate::_run('default', 'app')
#11 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->__call('run', Array)
#12 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->run()
#13 /app/fuel-app/fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#14 [internal function]: Oil\Refine::run('migrate', Array)
#15 /app/fuel-app/fuel/packages/oil/classes/command.php(126): call_user_func('Oil\Refine::run', 'migrate', Array)
#16 /app/fuel-app/oil(68): Oil\Command::init(Array)
#17 {main}

Previous exception: 
Uncaught exception PDOException: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Callstack: 
#0 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(95): PDO->__construct('mysql:host=loca...', 'root', 'root', Array)
#1 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(193): Fuel\Core\Database_PDO_Connection->connect()
#2 /app/fuel-app/fuel/core/classes/database/query.php(305): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
#3 /app/fuel-app/fuel/core/classes/dbutil.php(644): Fuel\Core\Database_Query->execute(NULL)
#4 /app/fuel-app/fuel/core/classes/migrate.php(608): Fuel\Core\DBUtil::table_exists('migration')
#5 /app/fuel-app/fuel/core/classes/migrate.php(74): Fuel\Core\Migrate::table_version_check()
#6 [internal function]: Fuel\Core\Migrate::_init()
#7 /app/fuel-app/fuel/core/classes/autoloader.php(375): call_user_func('Migrate::_init')
#8 /app/fuel-app/fuel/core/classes/autoloader.php(249): Fuel\Core\Autoloader::init_class('Migrate')
#9 [internal function]: Fuel\Core\Autoloader::load('Migrate')
#10 /app/fuel-app/fuel/core/tasks/migrate.php(235): spl_autoload_call('Migrate')
#11 /app/fuel-app/fuel/core/tasks/migrate.php(161): Fuel\Tasks\Migrate::_run('default', 'app')
#12 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->__call('run', Array)
#13 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->run()
#14 /app/fuel-app/fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#15 [internal function]: Oil\Refine::run('migrate', Array)
#16 /app/fuel-app/fuel/packages/oil/classes/command.php(126): call_user_func('Oil\Refine::run', 'migrate', Array)
#17 /app/fuel-app/oil(68): Oil\Command::init(Array)
#18 {main}

まず、mysqlコンテナを調べると、 /var/lib/mysql/mysql.sockはなくあったのは/var/run/mysqld/mysqld.sock
この場合、/var/run/mysqld/mysqld.sockをphpコンテナから見えるようにしてあげればいい。
ただ、phpコンテナから見ているのは、/var/lib/mysql/mysql.sockであったため、/var/run/mysqld/mysqld.sockにするとphpコンテナを修正する手間があった。

そのため、今回phpコンテナ側は修正をしたくなかったので、/var/lib/mysql/mysql.sockに合わせることにした。

①mysqlコンテナの/etc/mysql/my.cnfをホストの/docker/mysql/my.cnfでマウント。
設定は、/var/lib/mysql/mysql.sockを見るようにした。
② ①の対応をした上で、phpコンテナからも/etc/mysql/my.cnfをホストの/docker/mysql/my.cnfでマウント。

phpコンテナからも/var/lib/mysql/mysql.sockが見えるようになったことでMySQLとの通信が成功し、マイグレーションも成功した。

変更ファイルは以下の通り。

my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
      - ./docker/mysql/volumes:/var/lib/mysql
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最低限の労力でLaravelのタスクスケジュール ( Task Scheduling ) + AWS ECS

最低限の労力でLaravelのタスクスケジュール ( Task Scheduling ) + AWS ECS

※ ある程度LaravelのCommandやECSを利用している人向けの記事です
※ イメージにはphp:7.3-fpm-alpineベースで、他にミドルウェアを色々入れたものを利用
※ Laravelは6.0を利用

EC2 + cron + Laravelで動いていた定期処理実行サーバを、ECSに移すことになりました。
以前から、WebはECS + Laravel (+ Nginx)で動かしてました
まあ、インフラ管理方法が2種類あるのは負担でしかないですよね。。。

それで、方法を考えると、ECSの"タスクのスケジューリング"だろうとは思ったのですが

  • たくさんECSのスケジュールタスクを作るのは面倒...
  • CloudFormationを書くには、このプロジェクトは遅すぎた。cloudformationの運用も面倒...

そんなわけで、Laravelのタスクスケジュールと、ECSの”タスクのスケジューリング”を組み合わせてみました。
両方似たような名前で頭がオカシクなりそうです。

注意事項

これから紹介する方法は、以下を許容できる処理に限定した方が良いと思います

  • スケジュールが多少いい加減で良い
    • イメージの内容によるが、コンテナ(タスク)が立ち上がるまでに数十秒かかる
  • 時間に対応したスケジュールが一個ずつ実行されるため、全ての処理が完了するまでに時間がかかる
    • ちなみにrunInBackground()を利用したら処理完了前にコンテナが終了すると思います(戒め)
  • 時間がかかる処理では、同じコマンドが並列実行されるリスクがある
    • つまり、コンテナが多重起動している状態もあるということ
    • 多重でScheduleを実行させないための実装がLaravelにあり
      • onOneServer(), withoutOverlapping()
      • onOneServer()の方が良さそう(小並感)
    • コンテナ(ECSタスク)の多重起動をECS側で禁止する方法もあるが、大事なタイミングでコマンドが実行されない危険性があるので、おすすめしない

重要な処理は、個別にECSタスク定義とECSスケジュールタスクを作った方が良いかと思います。
(同じタスク定義を利用しても設定でCMDを上書きできます。しかし、タスクの設定でタスク定義のリビジョンを上げるたびに再度指定することになります。おすすめしません。)

全体像

Laravelのタスクスケジュールで、定期実行の設定を記述

以下を参考に、淡々と記述すればOK。
https://readouble.com/laravel/6.0/ja/scheduling.html

EC2なんかでcronですでに設定されていれば、cron()使えば楽にスケジュールを指定可能。

ECSのスケジュールタスクを設定

  • ECSでLaravelが動くDockerイメージが作成できていれば、それを利用してバッチ処理用のタスク定義を作成
    • タスク定義では、コンテナ設定でCMDを php artisan schedule:run に変更
      • すでにLaravelがPHP-FPMとかで動くイメージを利用する場合、起動時の動作(CMD)を上書きできる状態に変更
        • ENTRYPOINTが指定されていた場合、ENTRYPOINTは実行時に上書きできないし、CMDはENTRYPOINTの引数扱いとなり、実行時の挙動を上書きできない
        • ベースがphp-fpmのイメージなら、DockerfileでENTRYPOINTを [] に上書き(無効化)して、CMDを["docker-entry-point","php-fpm"]とかに変えればいいと思います

ECSで"タスクのスケジューリング"を設定

上記のタスクを毎分起動するように設定。

(おまけ) エラー通知

例外発生時には、通知はもちろんスタックトレースとかも確認できるようにしたい。
LaravelのScheduleには、before, after, onFailuereといったフックがあるんですが、出力を参照できないっぽいから、こいつらは大した事はできないです。これはすごい悩んだ。

いやまあ、杞憂でしたけどorz。

エラー時には、普通にHandlerに引っかかります。
つまり、app/Exceptions/Handler.php内の処理。
既にSlack通知なりが設定されてれば、ECSスケジュールタスクでの例外発生時にも、同様にSlack通知されます。
定期処理だけ特別な処理をしたいなら、タスク定義に定期処理フラグ的な環境変数でも適当に設定して、その環境変数の値をもってHandlerの処理を分岐させれば良いと思われます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelの実行環境をDockerで構築する

概要

docker-composeを使ってLaravelの実行環境を構築します。
作成するコンテナはPHP-FPM、Nginx、MySQLの3つです。

環境

Docker:19.03 ホストOS:Ubuntu 18.04(Vagrant)
Laravel:6.1.0 PHP-FPM:7.3 PHP:7.3.10  Nginx:1.17.4 MySQL:8.0
*Dockerおよびdocker-composeはホストOS(Vagrant上のUbuntu)上にインストールされているものとします。

ディレクトリ構成

docker
|- docker-compose.yml
|- laravel
|- mysql 
|   |- Dockerfile
|   |- my.cnf
|   ∟ sql
|     ∟ init.sql
|- nginx
|   |- Dockerfile 
|   ∟  default.conf
∟  php
   |- Dockerfile 
   ∟  local.ini

構築手順

1.Laravelとパッケージのインストール

初めに、ホストOS上にLaravelとパッケージをインストールします。コンテナにマウントする形でLaravelのファイルのコピーを行います。

・Laravelのインストール

最上位のdockerディレクトリ内で以下のコマンドを実行します。gitがない場合、先にインストールしてください。

git clone https://github.com/laravel/laravel.git laravel

dockerディレクトリにlaravelというディレクトリが作成され、Git HubからLaravelのプロジェクトがクローンされます。

・パッケージのインストール

作成されたlaravelディレクトリに移動して、コンテナからcomposer installを実行します。

cd laravel
docker run --rm --interactive --tty --volume $PWD:/app composer install

このコマンドは、Composerイメージからコンテナを一時的に作成し、Laravelに必要なパッケージをインストールします。

Laravelディレクトリをコンテナ内にマウントすることで、Composerコンテナがcomposer.jsonファイルを読み込んで利用できるようになっています。コンテナは実行後に消滅しますが、ディレクトリをマウントしているためホストOS上にインストールしたパッケージが残ります。公式のComposerイメージで紹介されている使用法です。

公式Composerイメージ

*ComposerイメージがホストOS上にない場合、イメージがdocker hubよりpullされます。

*注意:Composer実行中に以下のエラーが発生する場合があります。
proc_open(): fork failed errors
これはホストのメモリ不足によるものです。VMのメモリが1024MBだと発生するのでメモリを増やしましょう。

2.docker-compose.yml作成

続いて、以下のようなdocker-compose.ymlを作成します。

docker-compose.yml
version: '3'

services:

  php:
    build: ./php
    image: app_php:7.3-fpm
    container_name: php
    restart: unless-stopped
    working_dir: /var/www
    volumes:
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
      - ./laravel:/var/www
    networks:
      - app-network

  nginx:
    build: ./nginx
    image: app_nginx:1.17.4
    container_name: nginx
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./laravel:/var/www
    networks:
      - app-network
    depends_on:
      - php

  mysql:
    build: ./mysql
    image: app_mysql:8.0
    container_name: mysql
    restart: always    
    ports:
      - 3306:3306    
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      TZ: 'Asia/Tokyo'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql/sql:/docker-entrypoint-initdb.d
      - mysql-volume:/var/lib/mysql/
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-volume:
    driver: local

・PHPコンテナ

・image
通常、imageはコンテナで使用するイメージを指定しますが、「build」を使ってDockerfileからコンテナを起動する場合、docker-composeで作成するイメージにイメージ名とタグ名を付けることができます。ここでは「app_php」というイメージ名、「7.3-fpm」というタグ名を付与しています。

・volumes
./php/local.ini:/usr/local/etc/php/conf.d/local.ini
ホスト上のphpディレクトリ内のlocal.iniを、コンテナ内の「/usr/local/etc/php/conf.d/local.ini」にコピーします。こうすることで、コンテナ内のデフォルトのphp.iniを上書きすることができます。php.iniファイル自体は上書きされませんが、phpinfo()で情報を出力すると上書きされていることを確認できます。local.iniは後に作成します。

./laravel:/var/www
ホスト上でインストールしたlaravelディレクトリを、コンテナの「/var/www」とマウントします。こうすることで、ドキュメントルートを「/var/www/public」とすることができます。
開発環境であれば問題ありませんが、データをホストOSにマウントするのは推奨されていないため、本番で使う時はDockerボリュームを作成してマウントすることを検討しましょう。

*注意
セキュリティを向上させるため、ディレクトリをリードオンリーでマウントすることが推奨されていますが、Laravelではファイルシステムをリードオンリーにするとエラーが発生します。

./laravel:/var/www:ro(リードオンリー) → エラーが発生します。

・Nginxコンテナ

・volumes
./laravel:/var/www
Nginxコンテナでもlaravelディレクトリをマウントします。こうすることで、Nginxが受け付けたリクエストをLaravelで返すことができます。

・MySQLコンテナ

・command
--default-authentication-plugin=mysql_native_password
上記のコマンドでMySQLの認証方式を変更しています。MySQLはバージョン8.0から認証方式を変更しており、「caching_sha2_password」がデフォルトとなっています。PHPのMySQL接続ライブラリが未対応のため、認証方式を「mysql_native_password」に戻します。

・volumes
./mysql/sql:/docker-entrypoint-initdb.d
コンテナ内の「docker-entrypoint-initdb.d」以下にSQLを配置することで、初期設定などを行うことができます。

mysql-volume:/var/lib/mysql/
MySQLのデータをDockerのボリュームにマウントして永続化します。Dockerのボリュームはコンテナを削除しても残ります。そのため、コンテナに変更を加える場合、volumeを削除しなければenvironment等の設定を変更しても反映されないので気を付けましょう。

・environment
任意のユーザーとパスワードを設定してください。

*注意
Dockerにおける永続化データの保存には、データ専用コンテナを作成する方法がありますが、docker-composeのバージョン3からvolumes_fromオプションが削除されているため使用することができません。

3.Dockerfileの作成

次に、各コンテナを生成するDockerfileを作成します。

・PHPコンテナのDockerfile

phpディレクトリ内に以下のようなDockerfileを作成します。

Dockerfile
FROM php:7.3-fpm

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    default-mysql-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    libmcrypt-dev \
    libmemcached-dev \
    libzip-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql exif bcmath && \
    docker-php-ext-configure zip --with-libzip && \
    docker-php-ext-install zip && \
    docker-php-ext-configure gd \
    --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ && \
    docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 php && \
    useradd -u 1000 -ms /bin/bash -g php laravel

# Change current user to laravel
USER laravel

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

・ベースイメージ
公式イメージである「php:7.3-fpm」をベースイメージとしています。php:7.3-fpmのベースイメージは「debian:buster-slim」となっています。LaravelのプログラミングはPHPコンテナに入って行いますが、debianの上で行っていることを頭に入れておきましょう。

・ライブラリ、エクステンションのインストール
PHPおよびLaravelの実行に必要なライブラリ、エクステンションをインストールしています。

default-mysql-client
debian:buster-slimはmariadbをデフォルトとしており、mariadb-clientが使用されます。そのため、mysql-clientはインストールできません。その代わり、mysqlを利用するために「default-mysql-client」というものが用意されているので、そちらをインストールしています。

bcmath
Laravelを実行するためのサーバー要件としていくつかのエクステンションが必要ですが、多くはPHP本体に含まれています。ただし、bcmathが含まれていないため、別途「docker-php-ext-install」でインストールしています。

Laravelのサーバー要件

・ユーザーの作成
rootユーザーでDockerを操作するのはセキュリティ上好ましくないため、laravelというユーザーを作成しています。

・NginxコンテナのDockerfile

nginxディレクトリ内に以下のDokcerfileを作成します。

Dockerfile
FROM nginx:1.17.4
COPY default.conf /etc/nginx/conf.d/default.conf

イメージはdocker-compose.ymlに指定することもできますが、docker-composeで作成するイメージにイメージ名を付与することができるため、docker-composeのbuildからイメージを作成するようにしています。また、後に作成するdefault.confをコンテナ内にコピーしています。

・MySQLコンテナのDockerfile

mysqlディレクトリ内に以下のDokcerfileを作成します。

Dockerfile
FROM mysql:8.0
COPY my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
CMD ["mysqld"]
EXPOSE 3306

コンテナ内の「/etc/mysql/conf.d/my.cnf」に設定ファイルをコピーすることで、デフォルトのmy.cnfを上書きすることができます。
Windowsを使用している場合、VirtualBox経由でマウントしているディレクトリ/ファイルはすべてパーミッションが777 になります。MySQLは777の.cnfファイルを読み込みません。そのため、ファイルのパーミッションを変更しています。

4.設定ファイルの作成

次に、各コンテナで使用する設定ファイルを作成します。

・PHPの設定ファイル

phpディレクトリ内にlocal.iniという設定ファイルを作成します。

local.ini
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
memory_limit = 256M
post_max_size = 100M
upload_max_filesize = 100M
date.timezone = "Asia/Tokyo"
mysqlnd.collect_memory_statistics = Off
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto

デフォルトのphp.iniが上書きされるので、変更が必要な項目のみ記載します。設定はLaravelの公式の開発環境であるHomesteadやLaradockを参考にしています。Homesteadではセキュリティの関係上、pcntl系の関数を使用しないようにしているようです。「memory_limit」や「post_max_size」などは、必要に応じて適宜変更してください。

・Nginxの設定ファイル

nginxディレクトリ内にdefault.confという設定ファイルを作成します。

default.conf
server {
    listen 80;
    root /var/www/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

この設定はLaravelの公式ドキュメントの設定です。公式の設定では「fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;」となっているところを「fastcgi_pass php:9000;」と変更しています。コンテナ間で通信が行えるようにするため、php7.2-fpm.sock(Unixドメインソケット)を使うのではなく、PHPコンテナの9000番のポートを指定(php:9000)してTCP通信を行います。

Laravel公式ドキュメントのNginx設定

・MySQLの設定ファイル

mysqlディレクトリ内にmy.confという設定ファイルを作成します。

my.conf
[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

こちらもデフォルトのmy.cnfを上書きできるため、変更する項目のみ記載します。日本語を使えるようにする設定です。

また、mysql/sqlディレクトリ内に以下のinit.sqlというファイルを作成します。

init.sql
GRANT ALL PRIVILEGES ON *.* to user@"%";
FLUSH PRIVILEGES ;

こちらはコンテナが起動する際に実行されるコマンドです。作成したユーザーに権限を与えます。

5.コンテナの起動とMySQLの接続確認

・コンテナの起動

docker-compose.yml、Dockerfile、設定ファイルを作成した後、コンテナを起動します。
コンテナを起動する前に、Laravelの設定ファイルを「.env」として作成します。その後、docker-compose.ymlファイルのあるdockerディレクトリに移動します。

cp .env.example .env
cd ..

docker-composeでコンテナを起動します。以下のコマンドを実行すると、各コンテナのイメージも作成されます。途中で「debconf: delaying package configuration, since apt-utils is not installed」という警告が出ますが、単なる警告なので問題ありません。すべての処理が完了するまで数分かかります。

docker-compose up -d

処理が完了したら、以下のコマンドで確認します。

docker-compose ps

以下のようにコンテナが立ち上がっていたら成功です。

Name               Command               State                    Ports
-----------------------------------------------------------------------------------------
mysql   docker-entrypoint.sh --def ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
nginx   nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
php     docker-php-entrypoint php-fpm    Up      9000/tcp

次に、Laravelのアプリケーションキーを設定します。PHPコンテナ内でphp artisanコマンドを実行します。

docker-compose exec php php artisan key:generate

Laravelの設定ファイル.envの「APP_KEY」にキーが設定されます。次のコマンドで設定をキャッシュに反映させます。

docker-compose exec php php artisan config:cache

ホストOSのIPアドレス(Vagrantfileに設定したIP)にブラウザからアクセスして以下の画面が表示されたら正常に動作しています。

laravel.png

・MySQLの接続確認

最初に、Laravelのデータベースの設定を行います。.envファイルを次のように設定します。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=user
DB_PASSWORD=pass

DB_HOSTにはコンテナ名であるmysqlと記述します。続いて、config/database.phpファイルを設定します。「'strict' => false」は、「mysql_native_password」の認証方式を利用するための設定です。

'host' => env('DB_HOST', 'mysql'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'user'),
'password' => env('DB_PASSWORD', 'pass'),
'strict' => false,

以下のコマンドで設定をキャッシュに反映させます。

docker-compose exec php php artisan config:cache

PHPコンテナに入り、接続の確認をしていきます。

docker exec -it php /bin/bash

コンテナに入ったら、以下のコマンドでデータベースのマイグレーションを実行します。

php artisan migrate

続いてtinkerを起動します。

php artisan tinker

次のコマンドを実行して、マイグレーションを行ったデータが返ってきたらMySQLとの接続が成功しています。

\DB::table('migrations')->get();

「Ctrl + C」を押してtinkerを終了し、ロールバックを行います。

php artisan migrate:rollback

なお、PHPコンテナにログインすると、Dokcerfileで定義したユーザーとしてログインします。rootユーザーではないため、コマンドの実行が制限されています。rootとしてログインしたい場合は、以下のようにuオプションに0を指定します。

docker exec -it -u 0 php /bin/bash

以上でDockerによるLaravelの実行環境の構築は終了です。

参考にした記事

今回の環境構築は次の記事を参考にさせて頂きました。

How To Set Up Laravel, Nginx, and MySQL with Docker Compose

Dockerを使ってLaravel開発環境構築

Dockerは非常に奥が深く、習得するのに時間がかかるツールと思いますが、Dockerfileやdocker-compose.ymlを自分で書くことで理解を深めていくことができます。

この記事が参考になれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker applicationを動かしてみた

株式会社日立製作所 研究開発グループ サービスコンピューティング研究部の長沼です。
今回はCloud Native Application Bundles(CNAB)という観点で、実装の1つであるdocker applicationを動かしてみましたので、その内容について紹介します。
CNABの概要については、こちらの記事を参照ください。

docker applicationとは

公式のREADME.mdによれば、
docker CLI Pluginとして動作する、アプリケーションをインストール・共有する仕組みです。

CNAB仕様と互換があり、Composeファイル(docker-compose.yml)から
CNABのinvocation image(アプリケーションをインストールするためのコンテナイメージ、すなわちインストーラ)を作成し、このinvocation imageをコンテナレジストリを用いて共有(配布・再利用)するための機能群を提供するものです。

以降では、この一連の流れを具体的な手順と合わせて説明していきます。

docker applicationの準備

動作環境

今回使用するマシンのOSとdocker、およびdocker-app(docker applicationを実現するコマンド)のversionは以下の通りとなります。
- ubuntu 18.04 LTS
- docker
- client: Docker Engine - Community 19.03.2
- Server: Docker Engine - Community 19.03.2
- docker-app: v0.8.0

またアプリケーションを展開するためのプライベートレジストリ(Harbor)と、インストール先として上記マシン上で動作するdocker swarmクラスタ、も準備しておきます。

インストール

まずdocker application(docker-appコマンド)のインストールを以下手順に従い実施していきます。
https://github.com/docker/app#installation

上記で紹介されているようにdocker-appは、スタンドアローンとして利用する方法と、
docker CLI Pluginによりdockerのサブコマンドとして利用する方法があります。

今回は、dockerのサブコマンドとして利用する方法を使う方法で紹介していきます。
具体的には、以下コマンドを実行します。

# docker-appのdownload
$ export OSTYPE="$(uname | tr A-Z a-z)"
$ curl -fsSL --output "/tmp/docker-app-${OSTYPE}.tar.gz" "https://github.com/docker/app/releases/download/v0.8.0/docker-app-${OSTYPE}.tar.gz"
$ tar xf "/tmp/docker-app-${OSTYPE}.tar.gz" -C /tmp/

# docker CLI plugin利用の設定
$ mkdir -p ~/.docker/cli-plugins && cp "/tmp/docker-app-plugin-${OSTYPE}" ~/.docker/cli-plugins/docker-app

appがサブコマンドとして認識されない('app' is not a docker command.などとなる)場合、dockerのexperimentalを有効にすることで解決する場合があります。
例えば、以下を実行します。

$ export DOCKER_CLI_EXPERIMENTAL=enabled

docker applicationの利用

docker applicationを利用する上で必要となる一連の流れとして、
- invocation imageの元となるコンテンツ開発
- CNAB invocation imageへのビルド、
- レジストリへのpush/pull、
- アプリケーションのインストール
を以下で紹介していきます。

コンテンツの開発

docker applicationは主に以下の3つのファイルからなります。
- metadata file (metadata.yml): アプリケーションのバージョンや説明などのメタ情報を記述
- compose file (docker-compose.yml): アプリケーションで使うイメージやポートなどの構成を記述
- parameter file (parameters.yml): compose fileに与える変数の定義を記述

以降では、docker applicationの例でも用いられている、指定メッセージを表示する簡単なWebサーバを動作させるアプリケーションの作成を例に挙げ、説明を行っていきます。

まず上記ファイルの雛形をinitコマンドを使って生成します。

$ docker app init hello-message

するとhello-message.dockerappというディレクトリが作成され、3つのファイルの雛形が作成されているのが確認できます。

なおinitコマンドに--single-fileオプションを付けると、この3つのファイルを一つにまとめた1ファイル(今回の場合はhello-message.dockerappというYAMLファイル)
として雛形を出力することもできます。

$ tree hello-message.dockerap
hello-message.dockerapp/
├── metadata.yml
├── parameters.yml
└── docker-compose.yml

この雛形を編集して、実際に動かすアプリケーションに必要な情報へ書き換えを行います。

ここでアプリケーション動作時に変更したい(変数化しておきたい)項目は、parameters.ymlにkey:valueの形式で記述し、docker-compose.yml側で変数${key}として埋め込むことができます。

今回の例では、表示するメッセージ(docker-compose.ymlの${message})と公開ポート(同じく${ports.port1})を変数としています。

metadata.yml
# アプリケーションのバージョン
version: 0.1.2
# アプリケーションの名前
name: hello-message
# アプリケーションの簡単な説明
description: This application returns a hello message for HTTP request.
# アプリケーションやパッケージのメンテナの名前・E-Mail
maintainers:
  - name: maintainer.name
    email: maintainer@email.address
parameters.yml
# docker-compose.ymlの${message}に対応するkeyとvalue(デフォルト値)
message: world 
# keyを階層構造にもできる
ports:
  port1: 5678 
docker-compose.yml
version: "3.3"
services: 
  hello-server:
    image: hashicorp/http-echo
    # ${message}は変数として扱われる
    command: ["-text", "hello ${message}"]
    ports:
      - ${ports.port1}:5678

これら用いて、docker app renderにより変数化部分に値が入ったdocker-composeファイルを生成することもできます。
以下ではメッセージ部分はデフォルト値(parameters.yamlで指定した値)、公開ポート部分は--setオプションで変更した値、で生成したdocker-composeファイルを生成する例を示しています。

$ docker app render --set ports.port1=8080
version: "3.3"
services:
  hello-server:
    command:
    - -text
    - hello world
    image: hashicorp/http-echo
    ports:
    - mode: ingress
      target: 5678
      published: 8080
      protocol: tcp

invocation imageのビルド・レジストリへのpush/pull

invocation imageのビルド

docker app bundleコマンドにより、hello-message.dockerappに対する
- CNABのinvocation image(アプリのインストーラ)の作成
- CNABのbundle.json(CNABが規定するパッケージのメタ情報)
を行うことができます。

# invocation imageのbuild
$ docker app bundle
Invocation image "hello-message:0.1.2-invoc" successfully built

# invocation imageの確認
$ docker images | grep hello-message
hello-message          0.1.2-invoc         fbce87b60497        23 seconds ago      49.1MB

# bundle.jsonの確認
$ls .
bundle.json  docker-compose.yml  metadata.yml  parameters.yml

ちなみに現在のdocker-appの実装では、実はdocker app renderでもCNAB invocation imageのビルドが行われるようです。
変数に値を入れたdocker-composeファイルを生成するにしては処理時間がかかると感じたら、実はイメージのビルドも行っていたんですね。。

作成したinvocation imageの中身

作成したinvocation image(hello-message:0.1.2-invoc)とは、いったいどんなものか気になり、中身をのぞいてみました。

$ docker inspect hello-message:0.1.2-invoc
[
  {
    ...
    "Config": {
     "Hostname": "",
      "Domainname": "",
      "User": "cnab",
      "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
      "Cmd": [
        "/bin/sh",
        "-c",
        "/cnab/app/run"
      ], ...,
    }, ...
  }
]

から分かるように、invocation image実行時は、イメージ内の/cnab/app/runが起動されるようです。

invocation image内の/cnab内にどのようなものが格納されているかを見てみると、以下のように今回作成したhello-message.dockerappとrunコマンド(バイナリ)が格納されたものであることが確認できました。

# tree /cnab の結果
cnab
└── app
    ├── hello-message.dockerapp
    │   ├── bundle.json
    │   ├── docker-compose.yml
    │   ├── metadata.yml
    │   └── parameters.yml
    └── run

レジストリへのpush・pull

さらに作成したinvocation imageは、レジストリに格納することができます。
これにより、dockerイメージと同じようにレジストリを介し、invocation image(すなわちアプリのインストーラ)を配布・再利用することができるようになります。

以降ではローカルに立てたレジストリ(registry:5000)を介してinvocation imageをpush/pullする例を示しています。
今回はinsecure registryを使ったため、--insecure-registriesオプションを付ける必要がありました。

# レジストリへpush
$ docker app push --insecure-registries registry:5000 --tag registry:5000/hello-message:0.1.2

# レジストリからのpull
$ docker app pull --insecure-registries registry:5000 registry:5000/hello-message:0.1.2

さらにdocker app inspectをpush前後で比較してみると単純なpushではなく、以下のようにアプリケーションのイメージ(hello-serverに対応するimage)
も参照場所が書き換えられていました。
すなわちinvocation imageだけでなく、invocation imageに含まれるアプリのイメージも、今回invocation imageを格納したレジストリへ集約しているようです。

# hello-message.dockerappディレクトリ直下で実行した結果
$ docker app inspect .
hello-message 0.1.2

Maintained by: maintainer.name <maintainer@email.address>

This application returns a hello message for HTTP request.

Service (1)  Replicas Ports Image
-----------  -------- ----- -----
hello-server 1        5678  hashicorp/http-echo

Parameters (2) Value
-------------- -----
message        world
ports.port1    5678

Attachments (7)                                     Size
---------------                                     ----
bundle.json                                         2.345kB
...(略)


# pushしたregistry:5000/hello-message:0.1.2に対して実行するとhello-serverのImage部分が変更されている
$ docker app inspect --insecure-registries registry:5000 registry:5000/hello-message:0.1.2
hello-message 0.1.2

Maintained by: maintainer.name <maintainer@email.address>

This application returns a hello message for HTTP request.

Service (1)  Replicas Ports Image
-----------  -------- ----- -----
hello-server 1        5678  registry:5000/hello-message@sha256:ba27d460cd1f22a1a4331bdf74f4fccbc025552357e8a3249c40ae216275de96

Parameters (2) Value
-------------- -----
message        world
ports.port1    5678

Attachments (7)                                     Size
---------------                                     ----
bundle.json                                         2.345kB
...

アプリの起動

このようにビルドしたinvocation imageは、現状ではdocker swarmとkubernetesへインストール(デプロイ)することができます。
swarmの場合は、以下のようにしてアプリをインストール・確認できます。

# hello-messageのswarmへのインストール
$ docker app install --insecure-registries registry:5000 registry:5000/hello-message:0.1.2

# インストール結果の確認
$ docker app list
INSTALLATION  APPLICATION           LAST ACTION RESULT  CREATED    MODIFIED   REFERENCE
hello-message hello-message (0.1.2) install     success 12 seconds 11 seconds registry:5000/hello-message:0.1.2

# アンインストール
$ docker app uninstall hello-message

kubernetesも、compose-on-kubernetesでAPIを拡張したkubernetesクラスタに対して、--orchestrator kubernetesオプションを付けることでアプリケーションをインストールできるとのことです。
ただ今回準備した環境ではうまく動かすことができず、こちらは引き続き調査などを行っていきたいと思います。

まとめ

今回はdocker-appを使って、コンテンツの準備、CNABのinvocation imageのビルド/push/pull、およびアプリのインストールまでの流れを紹介しました。

これまでの資産として既にdocker-composeファイルで動作するアプリケーションがあり、これをCNAB仕様に従って共有したいようなユースケースには、うまくフィットする気がしました。
特にdocker app pull/pushという、慣れ親しんだdokcerコマンドの使い勝手でinvocation imageを配布/再利用(push/pull)できる仕組みはステキに感じました。

またCNAB向けのレジストリという点ではcnab-to-ociというプロジェクトでも議論されており、こういった周辺動向含め引き続き見ていきたいと思います。

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

kamonohashi をdockerで:未完

KAMONOHASHI
https://kamonohashi.ai

https://github.com/KAMONOHASHI/kamonohashi

install

https://kamonohashi.ai/docs/install-and-update

macOS
$ docker run -v /Users/Administrator/work:/home/work -p 8080:8080 -it ubuntu /bin/bash
# apt update; apt -y update
# apt install -y wget apt-utils sudo vim 
# export KQI_VERSION='1.1.2'
# wget -O /tmp/deploy-tools-$KQI_VERSION.tar.gz 
https://github.com/KAMONOHASHI/kamonohashi/releases/download/$KQI_VERSION/deploy-tools-$KQI_VERSION.tar.gz


--2019-10-11 06:39:29--  https://github.com/KAMONOHASHI/kamonohashi/releases/download/1.1.2/deploy-tools-1.1.2.tar.gz
Resolving github.com (github.com)... 13.114.40.48
Connecting to github.com (github.com)|13.114.40.48|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/188967625/222c1b00-e5e8-11e9-9d1f-ad9205903c1e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191011%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191011T063930Z&X-Amz-Expires=300&X-Amz-Signature=153a4ff98de0ed7f1eff048a90677cbaa4fdb862ada10b6e693bc51d3b2a7490&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddeploy-tools-1.1.2.tar.gz&response-content-type=application%2Foctet-stream [following]
--2019-10-11 06:39:30--  https://github-production-release-asset-2e65be.s3.amazonaws.com/188967625/222c1b00-e5e8-11e9-9d1f-ad9205903c1e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191011%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191011T063930Z&X-Amz-Expires=300&X-Amz-Signature=153a4ff98de0ed7f1eff048a90677cbaa4fdb862ada10b6e693bc51d3b2a7490&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddeploy-tools-1.1.2.tar.gz&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.184.35
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.184.35|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16403 (16K) [application/octet-stream]
Saving to: '/tmp/deploy-tools-1.1.2.tar.gz'

/tmp/deploy-tools-1.1.2.tar.gz    100%[==========================================================>]  16.02K  90.7KB/s    in 0.2s    

2019-10-11 06:39:31 (90.7 KB/s) - '/tmp/deploy-tools-1.1.2.tar.gz' saved [16403/16403]




# mkdir -p /var/lib/kamonohashi/deploy-tools/$KQI_VERSION/
# cd /var/lib/kamonohashi/deploy-tools/$KQI_VERSION/
# tar --strip=1 -xf /tmp/deploy-tools-$KQI_VERSION.tar.gz
./deploy-basic-cluster.sh deploy


--------------------------------------------------------------------------------------------
            ..NNNMMMMNNgJ..         #   #      ##     #     #    #####    #      #    ##### 
        ..NMMMMMMMMMMMMMMMMNa,      #  #       ##     ##   ##   #     #   ##     #   #     #
      .dMMMMMMMMMMMMMMMMMMMM"!      # #       #  #    # # # #   #     #   # #    #   #     #
    .dMMMMMMMMMMMMMMMMMMMD`         ###       #  #    # # # #   #     #   #  #   #   #     #
   .MMMMMMMMMMMMMMMMMMM'`           # #      #    #   #  #  #   #     #   #   #  #   #     #
  .MMMMMMMMMMMMMMMMMMM'    .MM      #  #     ######   #     #   #     #   #    # #   #     #
  MMMMMMMH""MMMMMMMMMM{    MMM'     #   #    #    #   #     #   #     #   #     ##   #     #
 .MMMMM'       _7"WMMY"             #    #   #    #   #     #    #####    #      #    ##### 
 dMMMM!                                                                                     
 dMMM#                              #    #     ##       ####     #    #      #              
 JMMMN                              #    #     ##      #         #    #      #              
 .MMMMp                             #    #    #  #     #         #    #      #              
  ?MMMMMNJ..                        ######    #  #      ##       ######      #              
   TMMMMMMMMMMMMMMMMMMMMMMMMNN..    #    #   #    #       ##     #    #      #              
    ?MMMMMMMMMMMMMMMMMMMMMMMMMMMMt  #    #   ######         #    #    #      #              
      TMMMMMMMMMMMMMMMMMMMMMMMMM!   #    #   #    #    #    #    #    #      #              
        7MMMMMMMMMMMMMMMMMMMM"`     #    #   #    #    #####     #    #      #              
           ?YMMMMMMMMMMMMB"`                                               クラスタ構築ツール                  
--------------------------------------------------------------------------------------------


##################################################
STEP[1/5] クラスタ設定の入力
##################################################

クラスタの構成情報を入力してください
詳細は https://kamonohashi.ai/docs/beforequickstart/install を参照してください
Kubernetes masterをデプロイするサーバ名: k8s-master
KAMONOHASHIをデプロイするサーバ名: kqi-node
Storageをデプロイするサーバ名: storage1
GPU サーバ名(,区切りで複数可): gpu-servere1,gpu-server2,gpu-server3
SSHユーザー名: sshuser
SSHパスワード(キーを使用する場合は未入力でEnter): 
SUDOパスワード(不要なら未入力でEnter): 
プロキシを設定しますか? [y/N]: N
KAMONOHASHIのadminパスワード(8文字以上):
./deploy-basic-cluster.sh

: line 98: envsubst: command not found

macOS
$ docker push kaizenjapan/kamonohashi

p.s.

https://github.com/KAMONOHASHI/kamonohashi/tree/master/release-tools/build-docker

内容確認中。

Type Name Latest commit message Commit time
build.sh build.shのバグ修正 4 months ago
cli-Dockerfile initial commit 5 months ago
push.sh 実行権限をスクリプトに付与 5 months ago
web-api-Dockerfile initial commit 5 months ago
web-pages-Dockerfile initial commit 5 months ago
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google Apps Script を TypeScript + Docker で開発する

以下のやり方で

  • Google Apps Script をローカルで書け、Git管理できる
  • TypeScriptで書ける
  • Docker内に環境構築するため、ホストOSを汚さない

の3つを満たすことができます。

Docker 環境を構築する

完了後のファイル構成

./
├── docker
│   ├── Dockerfile
│   └── docker-compose.yml
└── src
    ├── gas
    │   ├── appsscript.json
    │   └── hello.ts
    ├── package.json
    └── node_modules
        └── @types

docker-compose.yml

version: '2'
services:
  gas-build:
    build: .
    container_name: 'gas-build'
    tty: true
    volumes:
      - "../src:/opt/src"

Dockerfile

FROM node:8.16.2

RUN npm -v

RUN npm i @google/clasp -g

Docker Build

cd ./docker
docker-compose build

Dockerをデーモンとして起動して bash に入る

起動

docker-compose up -d

起動後、bash に入る

docker-compose exec gas-build bash

終了

docker-compose stop

これで npm + google/clasp が実行できる環境で bash に入ることができた。

clasp を使えるようにする

docker に bash で入って clasp による Google ログインを行う
docker であるため、 --no-localhost オプションをつける

clasp login --no-localhost

image.png

色々権限を求められるので、許可する。
許可完了後、コードが表示されるため、コピーをして、 bash 内に入力する

clasp のプロジェクトを作成する

GoogleAppsScript API の許可をしておく

image.png

プロジェクト作成

cd /opt/src
clasp create --title clasp-sample-project --parentId {GoogleDriveのフォルダID} --rootDir ./gas

image.png

Google Drive のフォルダIDは、フォルダを開いた後のURLを参照してください
https://drive.google.com/drive/folders/{GoogleDriveのフォルダID}

IDE で Google Apps Script のコード補完をできるようにしておく

cd /opt/src
npm install @types/google-apps-script

作成結果

image.png

TypeScript作成

テスト用ソースコード作成

ホストOS上にて、
./src/gas/hello.ts を作成

const greeter = (person: string) => {
  return `Hello, ${person}!`;
}

function testGreeter() {
  const user = 'Grant';
  Logger.log(greeter(user));
}

テストとして、Google Drive に Pushする

修正するたびに実行するため、Dockerコンテナ内からではなく、
ホストOSから実行できるようにする

docker-compose exec gas-build bash -c "cd /opt/src/ && clasp push"

image.png

clasp push に --watch のオプションをつけると、監視状態になり、変更の都度、自動でPushされる。

clasp でプッシュした結果

正常に Google Apps Script が反映されている!

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今日のdocker error:one of the subprocesses failed:

docker desktop for Mac : 2.1.0.2(37877)
macOS:10.12.6

error

dockererror1.png

Diagnose & Feedback

dockererror2.png

くるくる回って終わらない。
3分経過。

macOS
  PID TTY           TIME CMD
    1 ??       1319:46.53 /sbin/launchd
   41 ??         1:02.08 /usr/sbin/syslogd
   42 ??         5:36.14 /usr/libexec/UserEventAgent (System)
   44 ??         0:33.49 /Applications/ESET Endpoint Antivirus.app/Contents/MacOS/esets_ctl
   45 ??         1:37.92 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
   46 ??         0:04.59 /usr/libexec/kextd
   47 ??        11:41.84 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
   49 ??         0:16.36 /System/Library/PrivateFrameworks/MediaRemote.framework/Support/mediaremoted
   52 ??         0:01.90 /System/Library/CoreServices/appleeventsd --server
   53 ??        17:54.02 /usr/libexec/configd
   54 ??         0:54.32 /System/Library/CoreServices/powerd.bundle/powerd
   55 ??         0:06.25 /usr/libexec/mobileassetd
   60 ??        19:51.05 /usr/libexec/logd
   64 ??         0:27.30 /usr/libexec/airportd
   66 ??         0:01.93 /usr/libexec/warmd
   72 ??         0:00.37 /System/Library/CoreServices/iconservicesd
   73 ??         0:00.35 /System/Library/CoreServices/iconservicesagent
   75 ??         0:06.95 /usr/libexec/diskarbitrationd
   78 ??         0:40.56 /usr/libexec/coreduetd
   79 ??         0:00.03 /usr/libexec/wdhelper
   84 ??         2:52.08 /usr/libexec/opendirectoryd
   85 ??         0:23.82 /usr/sbin/wirelessproxd
   87 ??         0:40.73 /System/Library/PrivateFrameworks/ApplePushService.framework/apsd
   88 ??         0:02.86 /Library/PrivilegedHelperTools/com.docker.vmnetd
   89 ??         0:00.02 /System/Library/PrivateFrameworks/Noticeboard.framework/Versions/A/Resources/nbstated
   90 ??        15:40.07 /System/Library/CoreServices/launchservicesd
   92 ??         0:39.72 /usr/sbin/securityd -i
   94 ??         1:08.16 /usr/libexec/locationd
   96 ??         0:08.65 /usr/libexec/DuetHeuristic-BM
   97 ??         1:52.94 /usr/libexec/displaypolicyd -k 1
   98 ??         1:26.82 /usr/sbin/blued
   99 ??         0:00.28 autofsd
  103 ??        48:33.76 /Applications/ESET Remote Administrator Agent.app/Contents/MacOS/ERAAgent
  104 ??         0:00.79 /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/Support/revisiond
  106 ??         0:00.24 /System/Library/CoreServices/logind
  107 ??         0:00.02 /usr/sbin/KernelEventAgent
  110 ??       5727:23.89 /usr/libexec/hidd
  111 ??         0:04.21 /usr/libexec/corebrightnessd --launchd
  112 ??         0:18.27 /usr/libexec/AirPlayXPCHelper
  113 ??         0:13.24 /usr/libexec/amfid
  114 ??        10:45.98 /usr/sbin/notifyd
  115 ??        12:46.39 /usr/sbin/distnoted daemon
  116 ??         0:02.52 /System/Library/Frameworks/Security.framework/Versions/A/XPCServices/authd.xpc/Contents/MacOS/authd
  117 ??         0:15.34 /System/Library/CoreServices/coreservicesd
  119 ??         0:01.45 aslmanager
  120 ??         0:31.87 /usr/sbin/cfprefsd daemon
  160 ??         2:45.06 /usr/sbin/coreaudiod
  163 ??         0:00.27 /System/Library/Frameworks/PCSC.framework/Versions/A/XPCServices/com.apple.ctkpcscd.xpc/Contents/MacOS/com.apple.ctkpcscd
  165 ??         2:00.07 /usr/libexec/trustd
  166 ??         0:00.28 /System/Library/Frameworks/CryptoTokenKit.framework/ctkd -s
  170 ??         7:05.37 /usr/sbin/mDNSResponder
  172 ??         0:00.27 /System/Library/Frameworks/CoreAudio.framework/Versions/A/XPCServices/com.apple.audio.DriverHelper.xpc/Contents/MacOS/com.apple.audio.DriverHelper
  177 ??         1:06.64 /usr/libexec/sandboxd
  188 ??         2:34.42 /usr/sbin/mDNSResponderHelper
  190 ??         0:12.28 /usr/libexec/lsd runAsRoot
  192 ??         0:01.51 /System/Library/PrivateFrameworks/CoreSymbolication.framework/coresymbolicationd
  196 ??         0:00.27 /usr/sbin/systemstats --xpc
  197 ??         0:00.21 /System/Library/CoreServices/CrashReporterSupportHelper server-init
  198 ??         0:08.86 /usr/libexec/nsurlsessiond --privileged
  199 ??         9:53.13 /usr/sbin/ntpd -c /private/etc/ntp-restrict.conf -n -g -p /var/run/ntpd.pid -f /var/db/ntp.drift
  200 ??         0:02.48 /usr/libexec/nehelper
  201 ??         2:58.67 /usr/libexec/symptomsd
  202 ??         0:13.02 /usr/libexec/usbd
  203 ??         0:00.02 /System/Library/CryptoTokenKit/com.apple.ifdreader.slotd/Contents/MacOS/com.apple.ifdreader
  207 ??         0:01.56 /usr/libexec/thermald
  214 ??         0:10.94 /System/Library/PrivateFrameworks/WirelessDiagnostics.framework/Support/awdd
  216 ??         0:05.03 /usr/sbin/netbiosd
  218 ??         0:00.35 /System/Library/PrivateFrameworks/Heimdal.framework/Helpers/kdc
  219 ??         0:15.47 /usr/libexec/watchdogd
  225 ??         0:00.34 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/CVMServer
  229 ??         0:04.01 /System/Library/Frameworks/Security.framework/Versions/A/XPCServices/com.apple.CodeSigningHelper.xpc/Contents/MacOS/com.apple.CodeSigningHelper
  246 ??         0:00.80 /System/Library/CoreServices/sharedfilelistd --enable-legacy-services
  248 ??         1:21.96 /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/XPCServices/com.apple.PerformanceAnalysis.animationperfd.xpc/Contents/MacOS/com.apple.PerformanceAnalysis.animationperfd
  249 ??         0:00.13 /System/Library/Frameworks/CryptoTokenKit.framework/ctkahp.bundle/Contents/MacOS/ctkahp -d
  250 ??         0:00.40 /usr/libexec/secinitd
  257 ??         3:43.13 sysmond
  258 ??         0:00.44 /System/Library/PrivateFrameworks/AccountPolicy.framework/XPCServices/com.apple.AccountPolicyHelper.xpc/Contents/MacOS/com.apple.AccountPolicyHelper
  260 ??         0:01.52 /usr/sbin/systemsoundserverd
  261 ??         0:00.13 /System/Library/PrivateFrameworks/TCC.framework/Resources/tccd system
  262 ??         0:00.93 /System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd
  263 ??         0:00.31 /Applications/.esets/Contents/MacOS/esets_daemon
  264 ??       153:45.51 /Applications/.esets/Contents/MacOS/esets_daemon --scan-process
  265 ??         0:00.56 /usr/libexec/securityd_service
  271 ??         0:00.11 /Applications/.esets/Contents/MacOS/esets_kac
  273 ??         0:42.00 /Applications/.esets/Contents/MacOS/esets_fcor
  274 ??         0:00.37 /Applications/.esets/Contents/MacOS/esets_mac
  275 ??         3:19.75 /Applications/.esets/Contents/MacOS/esets_proxy
  290 ??        23:06.62 /System/Library/CoreServices/Software Update.app/Contents/Resources/softwareupdated
  291 ??         0:01.55 /System/Library/PrivateFrameworks/SoftwareUpdate.framework/Resources/suhelperd
  298 ??         0:02.26 /usr/libexec/nsurlstoraged
  318 ??        11:58.57 /usr/sbin/cupsd -l
  328 ??         1:05.10 /usr/sbin/cfprefsd agent
  330 ??         2:34.19 /usr/sbin/distnoted agent
  331 ??        63:53.70 /usr/sbin/distnoted agent
  337 ??         0:00.31 /System/Library/Frameworks/GSS.framework/Helpers/com.apple.GSSCred
  343 ??        88:25.35 /usr/libexec/lsd
  359 ??         0:00.09 /usr/sbin/WirelessRadioManagerd
  365 ??         0:00.23 /System/Library/PrivateFrameworks/IMDPersistence.framework/XPCServices/IMDPersistenceAgent.xpc/Contents/MacOS/IMDPersistenceAgent
  372 ??         0:04.84 /usr/libexec/secinitd
  373 ??       1031:27.32 /usr/libexec/pkd
  377 ??         0:00.60 /usr/libexec/AssetCache/AssetCache
  379 ??         0:00.45 /System/Library/CoreServices/backupd.bundle/Contents/Resources/TMCacheDelete
  380 ??         0:01.83 /System/Library/PrivateFrameworks/PackageKit.framework/Resources/installd
  383 ??         3:20.39 /System/Library/PrivateFrameworks/PackageKit.framework/Resources/system_installd
  398 ??         0:00.40 /System/Library/Frameworks/Security.framework/Versions/A/Resources/CloudKeychainProxy.bundle/Contents/MacOS/CloudKeychainProxy
  399 ??         0:01.90 /System/Library/PrivateFrameworks/CloudPhotoServices.framework/Versions/A/Frameworks/CloudPhotosConfigurationXPC.framework/Versions/A/XPCServices/com.apple.CloudPhotosConfiguration.xpc/Contents/MacOS/com.apple.
  422 ??         0:00.30 /usr/libexec/findmydeviced
  426 ??         0:01.94 /usr/sbin/filecoordinationd
  432 ??         0:18.33 /System/Library/PrivateFrameworks/GeoServices.framework/Versions/A/XPCServices/com.apple.geod.xpc/Contents/MacOS/com.apple.geod
  470 ??         0:02.51 /usr/libexec/taskgated -s
  478 ??         0:00.27 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.SandboxHelper.xpc/Contents/MacOS/com.apple.audio.SandboxHelper
  480 ??         0:45.71 /usr/sbin/spindump
  487 ??         0:00.75 /System/Library/CoreServices/SubmitDiagInfo server-init
  504 ??         1:07.62 /usr/libexec/trustd --agent
  514 ??         0:11.59 /usr/libexec/wifivelocityd
  598 ??         0:00.70 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdflagwriter
  630 ??         0:00.40 /usr/libexec/smd
  687 ??         0:00.27 /System/Library/PrivateFrameworks/InstallerDiagnostics.framework/Versions/A/Resources/installerdiagd
  748 ??         8:10.47 /System/Library/StagedFrameworks/Safari/SafariShared.framework/Versions/A/XPCServices/com.apple.Safari.History.xpc/Contents/MacOS/com.apple.Safari.History
  756 ??         0:00.27 /System/Library/PrivateFrameworks/StoreXPCServices.framework/Versions/A/XPCServices/com.apple.appstore.PluginXPCService.xpc/Contents/MacOS/com.apple.appstore.PluginXPCService
  855 ??         0:00.81 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdflagwriter
  857 ??         0:00.45 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/XPCServices/com.apple.DictionaryServiceHelper.xpc/Contents/MacOS/com.apple.DictionaryServiceHelper
  891 ??         0:00.72 /usr/libexec/dprivacyd
  922 ??         0:00.47 /System/Library/Frameworks/MediaAccessibility.framework/Versions/A/XPCServices/com.apple.accessibility.mediaaccessibilityd.xpc/Contents/MacOS/com.apple.accessibility.mediaaccessibilityd
  945 ??         0:18.17 /System/Library/Frameworks/ApplicationServices.framework/Frameworks/SpeechSynthesis.framework/Resources/com.apple.speech.speechsynthesisd
 1002 ??         0:00.04 /usr/libexec/periodic-wrapper daily
 1165 ??         0:02.02 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker-sizing -c MDSSizingWorker -m com.apple.mdworker.sizing
 1297 ??         0:08.46 /usr/libexec/syspolicyd
 1526 ??         0:08.98 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/XPCServices/com.apple.hiservices-xpcservice.xpc/Contents/MacOS/com.apple.hiservices-xpcservice
 3827 ??         0:00.25 /usr/sbin/aslmanager -s /var/log/eventmonitor
 5775 ??         0:00.06 /usr/libexec/applessdstatistics
 5957 ??         0:00.01 /usr/libexec/periodic-wrapper monthly
 5958 ??         0:00.01 /usr/libexec/periodic-wrapper weekly
 6007 ??        22:12.22 /usr/libexec/trustd --agent
 6014 ??         0:27.50 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console
 6018 ??        34:19.38 /System/Library/PrivateFrameworks/SkyLight.framework/Resources/WindowServer -daemon
 6020 ??         0:36.14 /System/Library/PrivateFrameworks/AmbientDisplay.framework/Versions/A/XPCServices/com.apple.AmbientDisplayAgent.xpc/Contents/MacOS/com.apple.AmbientDisplayAgent
 6036 ??         0:00.11 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
 6053 ??         2:25.68 /usr/libexec/UserEventAgent (Aqua)
 6057 ??         0:18.83 /System/Library/Frameworks/CoreTelephony.framework/Support/CommCenter -L
 6058 ??         0:01.20 /usr/sbin/usernoted
 6059 ??         0:04.12 /usr/libexec/nsurlsessiond
 6060 ??         2:57.32 /Applications/Epson Software/Event Manager.app/Contents/Resources/Assistants/Event Manager/EEventManager.app/Contents/MacOS/EEventManager
 6062 ??         0:02.65 /System/Library/PrivateFrameworks/CalendarAgent.framework/Executables/CalendarAgent
 6064 ??         0:00.29 /usr/libexec/networkserviceproxy
 6065 ??         0:56.81 /System/Library/CoreServices/SafariSupport.bundle/Contents/MacOS/SafariBookmarksSyncAgent
 6066 ??         0:00.17 /System/Library/PrivateFrameworks/QuickLookThumbnailing.framework/Support/com.apple.quicklook.ThumbnailsAgent
 6067 ??         0:11.20 /System/Library/PrivateFrameworks/CloudDocsDaemon.framework/Versions/A/Support/bird
 6068 ??         0:11.97 /System/Library/CoreServices/cloudphotosd.app/Contents/MacOS/cloudphotosd
 6069 ??         0:00.13 /System/Library/PrivateFrameworks/CoreFollowUp.framework/Versions/A/Support/followupd
 6071 ??         0:00.82 /System/Library/PrivateFrameworks/CoreSuggestions.framework/Versions/A/Support/suggestd
 6072 ??         0:00.29 /System/Library/PrivateFrameworks/PhotoAnalysis.framework/Versions/A/Support/photoanalysisd
 6074 ??         7:24.83 /usr/libexec/swcd
 6075 ??         0:00.04 /usr/libexec/DataDetectorsSourceAccess
 6076 ??       140:32.55 /usr/libexec/videosubscriptionsd
 6078 ??         0:00.42 /System/Library/Image Capture/Support/icdd
 6079 ??         0:00.27 /usr/libexec/secd
 6081 ??         0:00.66 /System/Library/Frameworks/Accounts.framework/Versions/A/Support/accountsd
 6083 ??         0:00.74 /System/Library/PrivateFrameworks/TelephonyUtilities.framework/callservicesd
 6084 ??         0:00.46 /System/Library/PrivateFrameworks/TCC.framework/Resources/tccd
 6086 ??         0:01.85 /System/Library/PrivateFrameworks/CalendarNotification.framework/Versions/A/XPCServices/CalNCService.xpc/Contents/MacOS/CalNCService
 6087 ??         0:12.39 /System/Library/PrivateFrameworks/CloudKitDaemon.framework/Support/cloudd
 6088 ??         0:01.01 /System/Library/PrivateFrameworks/IDS.framework/identityservicesd.app/Contents/MacOS/identityservicesd
 6089 ??         0:00.36 /System/Library/PrivateFrameworks/IMCore.framework/imagent.app/Contents/MacOS/imagent
 6090 ??         0:00.46 /usr/libexec/pboard
 6091 ??         5:35.15 /System/Library/PrivateFrameworks/CoreParsec.framework/parsecd
 6092 ??         0:00.14 /System/Library/Frameworks/Security.framework/Versions/A/Resources/KeychainSyncingOverIDSProxy.bundle/Contents/MacOS/KeychainSyncingOverIDSProxy
 6093 ??         0:02.02 /System/Library/CoreServices/pbs
 6094 ??         0:00.59 /System/Library/CoreServices/sharedfilelistd
 6097 ??         0:00.09 /usr/libexec/languageassetd --firstLogin
 6098 ??         0:00.30 /System/Library/Frameworks/AddressBook.framework/Executables/ContactsAccountsService
 6099 ??         0:03.65 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/storeaccountd
 6101 ??         4:30.42 /usr/libexec/nsurlstoraged
 6103 ??         0:02.89 /System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Contents/MacOS/IMRemoteURLConnectionAgent
 6104 ??         0:13.27 /System/Library/PrivateFrameworks/UserActivity.framework/Agents/useractivityd
 6105 ??         0:02.65 /System/Library/PrivateFrameworks/MediaRemote.framework/Support/mediaremoteagent
 6106 ??         0:00.06 /System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Contents/MacOS/IMRemoteURLConnectionAgent
 6107 ??         0:19.77 /usr/libexec/sharingd
 6108 ??         0:00.29 /System/Library/PrivateFrameworks/PrintingPrivate.framework/Versions/A/PrintUITool
 6109 ??         0:00.25 /usr/libexec/fmfd
 6113 ??         0:00.18 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/XPCServices/com.apple.CommerceKit.TransactionService.xpc/Contents/MacOS/com.apple.CommerceKit.TransactionService
 6115 ??         0:00.12 /System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd
 6116 ??         0:58.94 /System/Library/PrivateFrameworks/CacheDelete.framework/deleted
 6119 ??         0:04.36 /System/Library/PrivateFrameworks/PassKitCore.framework/passd
 6120 ??         0:00.09 /usr/libexec/nfcd
 6122 ??         0:24.04 /Applications/mi.app/Contents/MacOS/mi -psn_0_10615327
 6123 ??       240:59.91 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_10619424
 6124 ??         1:01.40 /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_10623521
 6125 ??         1:03.90 /Applications/BridgePoint.app/Contents/MacOS/bridgepoint -psn_0_10627618
 6127 ??         0:10.83 /Applications/System Preferences.app/Contents/MacOS/System Preferences -psn_0_10635812
 6128 ??         2:44.96 /Applications/Microsoft Word.app/Contents/MacOS/Microsoft Word -psn_0_10639909
 6130 ??         6:32.18 /Applications/Microsoft Excel.app/Contents/MacOS/Microsoft Excel -psn_0_10648103
 6131 ??         8:14.63 /Applications/LINE.app/Contents/MacOS/LINE -psn_0_10652200
 6132 ??        80:10.03 /Applications/App Store.app/Contents/MacOS/App Store -psn_0_10656297
 6133 ??         0:09.11 /Applications/Epson Software/EPSON Manuals.app/Contents/MacOS/EPSON Manuals -psn_0_10660394
 6134 ??         0:39.58 /Applications/Mail.app/Contents/MacOS/Mail -psn_0_10664491
 6135 ??         0:18.43 /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock
 6137 ??         0:13.69 /System/Library/Frameworks/ApplicationServices.framework/Frameworks/ATS.framework/Support/fontd
 6138 ??         0:27.20 /System/Library/CoreServices/SystemUIServer.app/Contents/MacOS/SystemUIServer
 6139 ??        52:18.43 /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder
 6147 ??         0:14.07 /System/Library/CoreServices/Spotlight.app/Contents/MacOS/Spotlight
 6151 ??         0:03.26 /System/Library/PrivateFrameworks/AuthKit.framework/Versions/A/Support/akd
 6155 ??         0:01.50 /System/Library/CoreServices/iconservicesagent
 6157 ??         0:00.12 /System/Library/Frameworks/CryptoTokenKit.framework/ctkahp.bundle/Contents/MacOS/ctkahp
 6159 ??         0:00.12 /System/Library/Frameworks/CryptoTokenKit.framework/ctkd -tw
 6160 ??         0:00.12 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6161 ??         0:04.61 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/storeassetd
 6166 ??         0:00.29 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/storedownloadd
 6167 ??         0:00.17 /System/Library/PrivateFrameworks/GeoServices.framework/geodMachServiceBridge
 6172 ??         0:00.21 /System/Library/PrivateFrameworks/PhotoLibraryPrivate.framework/Versions/A/Support/photolibraryd
 6173 ??         0:08.77 /System/Library/CoreServices/Dock.app/Contents/XPCServices/com.apple.dock.extra.xpc/Contents/MacOS/com.apple.dock.extra
 6176 ??         0:00.11 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6177 ??         0:00.18 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/storelegacy
 6183 ??        84:15.67 /System/Library/Frameworks/InputMethodKit.framework/Resources/imklaunchagent
 6186 ??         0:00.21 /usr/libexec/SafariNotificationAgent
 6190 ??         4:16.30 /System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/MacOS/JapaneseIM
 6192 ??        27:23.79 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.Networking.xpc/Contents/MacOS/com.apple.WebKit.Networking
 6202 ??         0:03.67 /System/Library/CoreServices/mapspushd
 6222 ??         0:00.15 /System/Library/PrivateFrameworks/CoreWLANKit.framework/Versions/A/XPCServices/WiFiProxy.xpc/Contents/MacOS/WiFiProxy
 6240 ??         0:00.54 /System/Library/PrivateFrameworks/MessagesKit.framework/Resources/soagent.app/Contents/MacOS/soagent
 6245 ??         0:03.16 /System/Library/CoreServices/AppleIDAuthAgent
 6246 ??         0:00.26 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/maspushagent
 6247 ??         0:00.55 /usr/libexec/keyboardservicesd
 6248 ??         0:00.20 /System/Library/PrivateFrameworks/AskPermission.framework/Versions/A/Resources/askpermissiond
 6273 ??         0:00.38 /System/Library/PrivateFrameworks/AssistantServices.framework/assistantd
 6274 ??         0:08.59 /System/Library/CoreServices/FolderActionsDispatcher.app/Contents/MacOS/FolderActionsDispatcher
 6276 ??         0:00.16 /usr/libexec/spindump_agent
 6279 ??         0:00.23 /System/Library/CoreServices/SocialPushAgent.app/Contents/MacOS/SocialPushAgent
 6282 ??         5:20.91 /Library/Printers/Canon/CUPS_SFP/BackGrounder/Canon CUPSSFP BackGrounder.app/Contents/MacOS/Canon CUPSSFP BackGrounder
 6284 ??        50:49.74 /Library/Application Support/EPSON/Scanner/ScannerMonitor/Epson Scanner Monitor.app/Contents/MacOS/Epson Scanner Monitor
 6285 ??       157:59.55 /System/Library/CoreServices/NotificationCenter.app/Contents/MacOS/NotificationCenter
 6287 ??         0:08.52 /Library/Printers/Brother/Utilities/Server/LOGINserver.app/Contents/MacOS/LOGINserver
 6289 ??         0:08.35 /Applications/Epson Software/Epson Low Ink Reminder.app/Contents/EpsonLowInkReminderAgent.app/Contents/MacOS/EpsonLowInkReminderAgent
 6292 ??         0:11.65 /System/Library/CoreServices/AirPlayUIAgent.app/Contents/MacOS/AirPlayUIAgent --launchd
 6293 ??         0:12.33 /System/Library/CoreServices/cloudpaird
 6295 ??         0:09.01 /System/Library/PrivateFrameworks/Noticeboard.framework/Versions/A/Resources/nbagent.app/Contents/MacOS/nbagent
 6297 ??         0:09.00 /System/Library/CoreServices/WiFiAgent.app/Contents/MacOS/WiFiAgent
 6298 ??         0:00.88 /System/Library/CoreServices/diagnostics_agent
 6302 ??         0:09.20 /System/Library/CoreServices/Menu Extras/TextInput.menu/Contents/SharedSupport/TISwitcher.app/Contents/MacOS/TISwitcher
 6306 ??         0:00.12 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6310 ??         2:22.87 /Applications/ESET Endpoint Antivirus.app/Contents/MacOS/esets_gui
 6312 ??         0:00.18 /System/Library/PrivateFrameworks/CallHistory.framework/Support/CallHistoryPluginHelper
 6316 ??         0:06.03 /usr/libexec/WiFiVelocityAgent
 6317 ??         0:00.13 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6321 ??         0:00.21 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/XPCServices/com.apple.CommerceKit.TransactionService.xpc/Contents/MacOS/com.apple.CommerceKit.TransactionService
 6322 ??         0:10.45 /System/Library/Frameworks/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.Networking.xpc/Contents/MacOS/com.apple.WebKit.Networking
 6323 ??         0:11.66 /System/Library/Frameworks/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 6335 ??         0:10.33 /System/Library/PrivateFrameworks/ViewBridge.framework/Versions/A/XPCServices/ViewBridgeAuxiliary.xpc/Contents/MacOS/ViewBridgeAuxiliary
 6338 ??         0:11.43 /System/Library/PreferencePanes/Security.prefPane/Contents/XPCServices/com.apple.preference.security.remoteservice.xpc/Contents/MacOS/com.apple.preference.security.remoteservice
 6339 ??         0:05.36 /Applications/iTunes.app/Contents/MacOS/iTunesHelper.app/Contents/MacOS/iTunesHelper
 6341 ??         0:07.33 /Library/Printers/Brother/Utilities/Server/USBserver.app/Contents/MacOS/USBserver
 6342 ??        15:00.53 /Applications/.esets/Contents/Helpers/esets_tray.app/Contents/MacOS/esets_tray
 6343 ??         0:08.78 /Applications/VMware Fusion.app/Contents/Library/VMware Fusion Start Menu.app/Contents/MacOS/VMware Fusion Start Menu
 6346 ??         0:08.15 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesisServer.app/Contents/MacOS/SpeechSynthesisServer launchd
 6349 ??         0:00.09 /usr/libexec/diskmanagementd
 6350 ??         0:00.25 /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Resources/storeinappd
 6355 ??         0:20.22 /Library/Printers/Brother/Utilities/Server/NETserver.app/Contents/MacOS/NETserver
 6360 ??         0:00.18 /Users/administrator/Library/Application Support/Google/Android File Transfer/Android File Transfer Agent.app/Contents/MacOS/Android File Transfer Agent
 6362 ??         0:00.14 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6366 ??         0:00.13 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6367 ??         0:07.03 /System/Library/Services/AppleSpell.service/Contents/MacOS/AppleSpell
 6370 ??         0:00.15 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6371 ??         0:00.18 /System/Library/CoreServices/Software Update.app/Contents/Resources/softwareupdate_notify_agent
 6386 ??         0:00.16 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6399 ??         0:00.11 /usr/libexec/loginitemregisterd
 6406 ??         0:00.56 /System/Library/CoreServices/ScopedBookmarkAgent
 6420 ??         0:00.18 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6425 ??         0:00.30 /System/Library/StagedFrameworks/Safari/SafariShared.framework/Versions/A/XPCServices/com.apple.Safari.ImageDecoder.xpc/Contents/MacOS/com.apple.Safari.ImageDecoder
 6426 ??         0:13.61 /System/Library/StagedFrameworks/Safari/SafariShared.framework/Versions/A/XPCServices/com.apple.Safari.SearchHelper.xpc/Contents/MacOS/com.apple.Safari.SearchHelper
 6428 ??         0:08.36 /System/Library/PrivateFrameworks/SafariSafeBrowsing.framework/com.apple.Safari.SafeBrowsing.Service
 6429 ??         0:30.18 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.Storage.xpc/Contents/MacOS/com.apple.WebKit.Storage
 6430 ??         0:51.43 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 6482 ??         0:00.08 /System/Library/PrivateFrameworks/KerberosHelper/Helpers/DiskUnmountWatcher
 6500 ??         0:13.95 /System/Library/PreferencePanes/Sound.prefPane/Contents/XPCServices/com.apple.preference.sound.remoteservice.xpc/Contents/MacOS/com.apple.preference.sound.remoteservice
 6501 ??         0:00.12 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6506 ??         0:13.17 /System/Library/Frameworks/Foundation.framework/Versions/C/XPCServices/LookupViewService.xpc/Contents/MacOS/LookupViewService
 6541 ??        24:58.06 /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/com.apple.appkit.xpc.openAndSavePanelService.xpc/Contents/MacOS/com.apple.appkit.xpc.openAndSavePanelService
 6567 ??         0:00.12 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.SandboxHelper.xpc/Contents/MacOS/com.apple.audio.SandboxHelper
 6569 ??       121:41.56 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 6570 ??         0:00.17 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.SandboxHelper.xpc/Contents/MacOS/com.apple.audio.SandboxHelper
 6572 ??         0:00.17 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.ComponentHelper.xpc/Contents/MacOS/com.apple.audio.ComponentHelper
 6579 ??         0:00.10 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6604 ??         0:00.15 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 6642 ??         0:00.32 /System/Library/PrivateFrameworks/DiskImages.framework/Resources/diskimages-helper -uuid 713AE564-9CB3-4F03-85CD-A7AE002705CE -post-exec 4
 6649 ??         0:00.08 /System/Library/PrivateFrameworks/DiskImages.framework/Resources/hdiejectd
 6669 ??         0:10.84 /System/Library/CoreServices/Installer.app/Contents/MacOS/Installer -psn_0_11012736
 6670 ??         0:00.14 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 7126 ??         0:00.34 /System/Library/CoreServices/EscrowSecurityAlert.app/Contents/MacOS/EscrowSecurityAlert
 7127 ??         0:00.23 /System/Library/PrivateFrameworks/ProtectedCloudStorage.framework/Helpers/ProtectedCloudKeySyncing
 7129 ??         0:00.16 /System/Library/PrivateFrameworks/StorageManagement.framework/Resources/diskspaced
 7162 ??         0:00.34 /System/Library/PrivateFrameworks/AssistantServices.framework/Versions/A/XPCServices/media-indexer.xpc/Contents/MacOS/media-indexer
 7182 ??         0:00.21 /Library/Frameworks/iTunesLibrary.framework/Versions/A/XPCServices/com.apple.iTunesLibraryService.xpc/Contents/MacOS/com.apple.iTunesLibraryService
 7255 ??         0:43.05 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 7256 ??         0:00.11 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 7288 ??         0:27.43 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 7298 ??         0:20.17 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 7382 ??         0:10.00 /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/com.apple.appkit.xpc.openAndSavePanelService.xpc/Contents/MacOS/com.apple.appkit.xpc.openAndSavePanelService
 7687 ??        12:47.94 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 7688 ??         0:00.28 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/XPCServices/VTDecoderXPCService.xpc/Contents/MacOS/VTDecoderXPCService
 7689 ??         0:00.09 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.SandboxHelper.xpc/Contents/MacOS/com.apple.audio.SandboxHelper
 7690 ??         0:00.11 /System/Library/Frameworks/AudioToolbox.framework/XPCServices/com.apple.audio.ComponentHelper.xpc/Contents/MacOS/com.apple.audio.ComponentHelper
 7691 ??         0:25.75 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 7708 ??         0:00.10 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
 7753 ??         1:20.67 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
 8359 ??         0:02.15 /System/Library/PrivateFrameworks/DiskImages.framework/Resources/diskimages-helper -uuid A74A30DC-3B98-48E3-8D1D-36A2A634A4B0 -post-exec 4
 8411 ??         0:00.23 /usr/libexec/SafariPlugInUpdateNotifier
 8451 ??         0:02.99 /System/Library/PrivateFrameworks/DiskImages.framework/Resources/diskimages-helper -uuid 9285AE26-1621-4BEA-92AB-9D577AA8DC1C -post-exec 4
10483 ??         0:51.30 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10484 ??         0:04.07 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10689 ??         0:05.18 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10720 ??         0:01.42 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10721 ??         0:00.09 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
10722 ??         0:03.92 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10723 ??         0:05.66 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10724 ??         0:00.09 /System/Library/Frameworks/Metal.framework/Versions/A/XPCServices/MTLCompilerService.xpc/Contents/MacOS/MTLCompilerService
10725 ??         0:06.19 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10735 ??         0:00.28 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10736 ??         0:00.21 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10737 ??         0:00.19 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10738 ??         0:00.22 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10745 ??         0:00.14 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10746 ??         0:00.13 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10747 ??         0:00.68 /System/Library/CoreServices/CoreServicesUIAgent.app/Contents/MacOS/CoreServicesUIAgent
10749 ??         0:23.24 /Applications/Docker.app/Contents/MacOS/Docker
10781 ??         0:00.19 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10782 ??         0:00.16 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
10797 ??         0:03.88 /Applications/Preview.app/Contents/MacOS/Preview
10800 ??         0:03.49 /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/com.apple.appkit.xpc.openAndSavePanelService.xpc/Contents/MacOS/com.apple.appkit.xpc.openAndSavePanelService
10802 ??         0:00.13 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdwrite
10862 ??         0:00.15 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.single
10919 ??         0:04.10 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10920 ??         0:13.76 /System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent
10921 ??         0:00.42 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker32 -s mdworker-lsb -c MDSImporterWorker -m com.apple.mdworker.32bit
10922 ??         0:00.42 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker32 -s mdworker-lsb -c MDSImporterWorker -m com.apple.mdworker.32bit
10923 ??         0:00.12 /System/Library/PrivateFrameworks/XprotectFramework.framework/Versions/A/XPCServices/XprotectService.xpc/Contents/MacOS/XprotectService
10924 ??         0:00.32 /System/Library/PrivateFrameworks/RemoteViewServices.framework/XPCServices/com.apple.security.pboxd.xpc/Contents/MacOS/com.apple.security.pboxd
10925 ??         0:00.11 /System/Library/Frameworks/ApplicationServices.framework/Frameworks/PrintCore.framework/Versions/A/printtool agent
14221 ??         0:00.83 /usr/sbin/cfprefsd agent
14222 ??         0:00.90 /usr/libexec/lsd
14223 ??         1:06.36 /usr/libexec/trustd --agent
14224 ??         1:08.62 /usr/sbin/distnoted agent
16252 ??         0:00.83 /usr/sbin/cfprefsd agent
19178 ??        19:01.09 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds
19368 ??         4:57.00 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mds_stores
32192 ??         1:00.29 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker-sizing -c MDSSizingWorker -m com.apple.mdworker.sizing
55043 ??         0:00.82 /usr/sbin/cfprefsd agent
55044 ??         1:06.15 /usr/sbin/distnoted agent
55047 ??         0:00.81 /usr/sbin/cfprefsd agent
55054 ??         1:04.12 /usr/sbin/distnoted agent
55057 ??         0:07.05 /usr/libexec/lsd
55059 ??         1:03.79 /usr/libexec/trustd --agent
55060 ??         0:07.06 /usr/libexec/lsd
55061 ??         1:03.95 /usr/libexec/trustd --agent
55068 ??         0:06.64 /usr/libexec/lsd
55069 ??         1:03.67 /usr/libexec/trustd --agent
57037 ??         1:04.88 /usr/sbin/distnoted agent
95570 ??         0:00.54 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker-sizing -c MDSSizingWorker -m com.apple.mdworker.sizing
 6178 ttys000    0:00.11 login -pfl administrator /bin/bash -c exec -la bash /bin/bash
 6189 ttys000    0:00.15 -bash
10966 ttys000    0:00.01 ps -ax
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Infrastructure as Code (IaC)

Why?

  • Windowsに色んなソフトウェア入れていったら途中で動かなくなった
    • 手順書?そんなもの残せるわけないじゃん?
  • Linuxシステムの色んな所にPythonが入っていて、しかも消して良いか分からん
    • anacondaとか色々あってそれぞれのチュートリアルしてたらたくさん入ってる...
  • 設定ファイルにredisと書いたらRedisが、postgresと書いたらPostgreSQLが起動して欲しい

Immutable Infrastructure

  • 構築したら手順書なんて書かないので逆に手順書から環境を構築する
  • 直接システムに環境を構築すると、手動でまた変なことをしてしまう
  • 一回使ったら消して新しく作り直したらいつも同じ!
  • すぐ消すので実機じゃなくて仮想マシンとして構築したい

Docker

  • Hyper-V, KVM等のハイパーバイザーの仮想マシン作るのはコストがかかる
  • 仮想ファイルシステムとOSリソースの管理だけしてくれたら十分
  • 仮想マシンは簡単にダウンロード・アップロード出来て欲しい
  • Linux container / Windows Server container

Dockerfile

  • 独自の手順書フォーマット
# docker.ioからubuntuコンテナを取ってきてベースにする
FROM ubnuntu
# ビルドに必要なライブラリをインストール
RUN apt install -y curl g++ make git cmake
# GitHubからダウンロードしてビルドしてインストール
RUN git clone http://github.com/grpc/grpc \
 && cd grpc \
 && cmake -Bbuild -H. -DCMAKE_INSTALL_PREFIX=/usr \
 && cmake --build build --target install
# これで/usrにgrpcがインストールされたubuntuが出来上がる
  • 構築したコンテナに名前を付けて管理する
docker build . --tag grpc-ubuntu

Continuous Integration (CI)

  • どのコードで・どの環境で・どの条件でテストされているのか分からなくなる
  • Docker内でテストを実行すればいつでもDockerfileに書いた通りの環境が使える
  • ユーザーも同じ環境が簡単に用意できる
  • すぐにどこでも環境を自動的に用意出来るので、GitにPushするだけで環境構築からテストまでやってくれる
    • OSSだと無料で使えるところが多い(Travis CI, Circle CI, Azure Pipeline, ...)
    • 課金で大量のサーバーを使えるようになる(Circle CI, Google Cloud Build, ...)

Continuous Delivery/Deployment (CD)

  • 本番・テスト環境へのデプロイも自動でやってほしい
  • コンテナ環境を常に使うことで、本番もテストも同じ環境で行うのでデプロイ時のエラーを防ぎやすい

CIOps

  • Git Pushのイベントでデプロイを行う
  • Heroku / GitLab Pages

GitOps

  • 常にGitリポジトリを監視し、その定義通りになるようにシステムを更新していく
  • より複雑なデプロイに対応できる(ローリングリリース、カナリアリリース)
  • Kubernetes (Deployment, ...)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む