20200329のdockerに関する記事は14件です。

Dockerで構築するEthereum PET-SHOP TRUFFLE BOXES(その3)

その1その2からの続きでで、ETHEREUM PET SHOP チュートリアルをやっていきます。

Creating a user interface to interact with the smart contract

今度は、UIの作成です。

最初に見たように、基本的な画面は表示されるようになっています。
チュートリアルのUI変更の最初としては、/src/js/app.js の、データを読み込んでいるinit() が、initWeb3() を呼び出しているので、これに手を入れていくとのこと。

まずは、web3のインスタンス作成。web3とは、web3 JavaScript library。これを使って、Ethereum ブロックチェーンとやりとりをします。

次は、スマートコントラクトのインスタンス作成です。
これは、truffle-contract ライブラリが行います。

まずやりたいのは、Adoption に接続して、getAdopters() を呼び出すことで、これをmarkAdopted Functionで行います。
養育引受済みのペットは、adoptボタン(引受ボタン)を使用不可にして、文字を「Success」にします。
console.log(err.message);
で、コンソールログ出力が可能です。

最後に、adopt() で引受ける処理を作成します。

これらを記載した、app.js は下記のようになります。

app.js
App = {
  web3Provider: null,
  contracts: {},

  init: async function() {
    // Load pets.
    $.getJSON('../pets.json', function(data) {
      var petsRow = $('#petsRow');
      var petTemplate = $('#petTemplate');

      for (i = 0; i < data.length; i ++) {
        petTemplate.find('.panel-title').text(data[i].name);
        petTemplate.find('img').attr('src', data[i].picture);
        petTemplate.find('.pet-breed').text(data[i].breed);
        petTemplate.find('.pet-age').text(data[i].age);
        petTemplate.find('.pet-location').text(data[i].location);
        petTemplate.find('.btn-adopt').attr('data-id', data[i].id);

        petsRow.append(petTemplate.html());
      }
    });

    return await App.initWeb3();
  },

  initWeb3: async function() {

    // Modern dapp browsers...
    if (window.ethereum) {
      App.web3Provider = window.ethereum;
      try {
        // Request account access
        await window.ethereum.enable();
      } catch (error) {
        // User denied account access...
        console.error("User denied account access")
      }
    }
    // Legacy dapp browsers...
    else if (window.web3) {
      App.web3Provider = window.web3.currentProvider;
    }
    // If no injected web3 instance is detected, fall back to Ganache
    else {
      App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');
    }
    web3 = new Web3(App.web3Provider);

    return App.initContract();
  },

  initContract: function() {

    $.getJSON('Adoption.json', function(data) {
      // Get the necessary contract artifact file and instantiate it with truffle-contract
      var AdoptionArtifact = data;
      App.contracts.Adoption = TruffleContract(AdoptionArtifact);

      // Set the provider for our contract
      App.contracts.Adoption.setProvider(App.web3Provider);

      // Use our contract to retrieve and mark the adopted pets
      return App.markAdopted();
    });

    return App.bindEvents();
  },

  bindEvents: function() {
    $(document).on('click', '.btn-adopt', App.handleAdopt);
  },

  markAdopted: function(adopters, account) {

    var adoptionInstance;

    App.contracts.Adoption.deployed().then(function(instance) {
      adoptionInstance = instance;

      return adoptionInstance.getAdopters.call();
    }).then(function(adopters) {
      for (i = 0; i < adopters.length; i++) {
        if (adopters[i] !== '0x0000000000000000000000000000000000000000') {
          $('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true);
        }
      }
    }).catch(function(err) {
      console.log(err.message);
    });

  },

  handleAdopt: function(event) {
    event.preventDefault();

    var petId = parseInt($(event.target).data('id'));

    var adoptionInstance;

    web3.eth.getAccounts(function(error, accounts) {
      if (error) {
        console.log(error);
      }

      var account = accounts[0];

      App.contracts.Adoption.deployed().then(function(instance) {
        adoptionInstance = instance;

        // Execute adopt as a transaction by sending account
        return adoptionInstance.adopt(petId, {from: account});
      }).then(function(result) {
        return App.markAdopted();
      }).catch(function(err) {
        console.log(err.message);
      });
    });

  }

};

$(function() {
  $(window).load(function() {
    App.init();
  });
});

Interacting with the dapp in a browser

では、ブラウザでdappを使用します。

最初は、MetaMask のインストールから説明が始まりますが、ここではインストールされているものとして、スキップします。チュートリアルでいうと、6.まで終わっている状態です。
その状態で、MetaMaskをganacheのネットワークに接続するわけですが、http://127.0.0.1:7545 ではなく、HTTP://10.200.10.1:7545 に接続します。e

ここまで来ると、ローカルサーバを起動して、dapp を使うことができるということで、その仕組みとして、lite-server が使用されているとのことです。

では、改めて、ブラウザでアプリを開いてみます。
チュートリアルでは、npm run dev を叩くとなっていますが、docker-compose で起動時にこれを実行することになっています。
いったん、Docker 環境を抜けます。

/usr/src/app # exit

そして、起動しなおします。

$ docker-compose down
$ docker-compose up -d

http://localhost:8003/
あれ、全部Successになってる・・・

スクリーンショット 2020-03-29 23.36.30.png

最後がイマイチですが、とりあえず、ここまでがチュートリアルでした。

Docker を使用して、開発する流れはできたかなと思います。
次は何をすれば良いのだろう・・・

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

組み込み系からWeb系へのスキルチェンジ【随時更新】

はじめに

組み込みの開発しかほぼしたことしかない中で、Web系のスキルを身に着けるためにやったことをメモっておきます。

現状のWeb系のスキル。

  • Perl/PHP/javascript/HTML5:ちょっと使えるレベル
  • セキュアド:取得済
  • ネスペ:一通り勉強はした(受かってはいない)
  • github/Slack:プライベートで少し使ってるレベル(業務?シャガイノサービスナンテシヨウキンシデスヨ)

書籍

  1. TECHNICAL MASTER はじめてのPHPプロフェッショナル開発 PHP7対応 :チーム開発に即した形(もちろん会社やプロジェクトにもよるだろうけど)で書かれてたので、PLをやるのに役立ちそうだったので購入。推奨動作環境はMacOSで書かれています。

環境構築

手持ちがWindows10 homeしかなくDockerを入れれないので、VirtualBox+Ubuntuベースで環境構築しました。

Windows10にVirtualBoxとUbuntuをインストール

Windows10にVirtualBoxとUbuntuをインストールを参考にしました。
Ubuntuのバージョンは2020/3/22時点で最新のLSTの「Ubuntu 18.04.4 LTS」を使用しましたが、手順はほぼ一緒です。

設定変更

Docker

VirtualBox に Ubuntu 18.04 と Docker をインストールしたメモを参考にインストール。バージョンは19.03.8。

追加でdocker-composeをインストール

$ sudo apt install docker-compose

PHP

一旦、書籍1.に合わせてPHP7.2を入れる。
Ubuntu 16.04 で PHP 7.2 を使う手順

MySQL

UbuntuにMySQLをインストールを参考にインストール。
バージョンは14.14。

$ sudo apt install mysql-server mysql-client
//rootユーザ設定
$ sudo mysql_secure_installation

Visual Studio Code

簡単にUbuntuにVSCode (Visual Studio Code) をインストールする方法を参考にインストール。
バージョンは1.43.2。

日本語化

Visual Studio Code のユーザーインタフェイス(UI) 表示を日本語にする

PHP IntelliSense

以下を参考に導入。

setting.jsonの設定は、LinuxのPHPのインストール先に合わせて以下になります。

~/.config/Code/User/setting.json
{
  "php.validate.enable": false,
  "php.suggest.basic": false,
  "php.executablePath": "/usr/bin/php"
}

うまくいかなかったとこ

Dcokerでdocker-entrypoint-initdb.dをマウントするときにPermission deniedエラーがでる。

docker-compose.ymlに以下を追加したら、エラーがでるようになった。(全文は書籍の内容なので割愛します。)

docker-compose.yml
    volumes:
      - ./Docker/mysql/sqls:/docker-entrypoint-initdb.d
$ docker-compose up
Creating network "phpbookapp_default" with the default driver
Creating php-book-app-db ... 
Creating php-book-app-db ... done
Attaching to php-book-app-db
php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started.
php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started.
php-book-app-db | ls: cannot open directory '/docker-entrypoint-initdb.d/': Permission denied
php-book-app-db exited with code 2

解決策

ホスト側のディレクトリにgroupとotherの読み取り・実行権限がなかったのが原因でした。。。

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

VSCode+docker-compose+php(xdebug)の環境構築のポイント

はじめに

ありふれた記事なのではあるが一発では起動できない。。
なので基本的なところは他の記事に譲るとして、必ずデバッグする為のポイントを上げてみた。

1. VSCodeにPHPDebugをインストール

インストール後にF5などでRUN and Debugを起動してlaunch.jsonを適当に作る。

launch.json
{
    "port": 19000,
    "pathMappings": {
        "/var/www/workspace/php_loach":"/Users/xxx/workspace/project/php_loach"
    }
}

注)他にも必要な項目はあるが、わかりやすく、portpathMappingsだけ取り上げた。他の記事で確認してほしい。
portはxdebugで指定するportと合わせる。webでアクセスするportとは違う。
pathMappingsのディレクトリは、projectのドキュメントルートを指定。dockerとローカルは同じディレクトリを指定。

2. サーバ側にxdebugをインストール

Dockerfileでxdebugをインストールする。(詳細は他の記事で確認してほしい)
そしてxdebug.iniを用意する。

xdebug.ini
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

; xdebug
xdebug.remote_enable = 1
xdebug.remote_enable = 1
xdebug.default_enable = 1
xdebug.remote_host = docker.for.mac.localhost
xdebug.remote_port = 19000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart = On

こんな感じの。(詳細は他の記事で確認してほしい)
ここのremote_portとlaunch.jsonのportをあわせる。
docker-composeのportは全く関係ない。docker-composeはアクセス用のportを書くところでxdebugのportは書かない。無視。

3. VSCodeのdebugを起動

launch.jsonを正しく設定してあると、F5を押しただけで、下のバーがオレンジに変わってXdebugが起動する。
そして、止めたいところでコードの左側にブレイクポイント(赤いマーク)をつける。

4. クライアント側の設定を忘れない

これ、忘れがち。。
ブラウザなら虫マークのdebugの拡張を追加して、虫マークを緑にする。
POSTMANなどでAPIのエンドポイントにアクセスするときは、エンドポイントの最後に
XDEBUG_SESSION_START=true
を追加する。

http://localhost:9001/api/getUser?XDEBUG_SESSION_START=true
これを忘れるとブレイクポイントで止まらない!!

終わりに

自分のハマりポイントを上げてみた。これですんなりと動いたのでこれ以外は思い浮かばない。。
もし、他にハマりポイントがあれば教えてほしい。

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

MySQLからcsvを出力する

環境

mysql : Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

SELECT文でcsvファイルを出力する

SELECT * FROM hoge INTO OUTFILE '/output/hoge.csv'
 FIELDS TERMINATED BY ','
 OPTIONALLY ENCLOSED BY '"'

dockerでMYSQLコンテナ立ち上げている場合、OUTFILEをマウント位置にすると良い

csvファイルを出力する際にエラーを吐いた場合

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

データの入出力エラー

MySQLの設定を確認

mysql> SELECT @@global.secure_file_priv;

+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+

このNULLがダメらしい

設定を変更して解決する

DockerでMySQLコンテナを立ち上げて.sqlファイルからDBを作る
立ち上げているコンテナは上の通りなので、my.cnfに以下を追記

[mysqld]
secure-file-priv = ""

コンテナ再起動で設定を反映させてると設定欄のNULLが消える

mysql> SELECT @@global.secure_file_priv;

+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
|                           |
+---------------------------+

これでSELECT文でcsvファイルが吐き出せるようになっているはず

参考資料

MySQLのバージョン確認方法
MySQLのSELECT文でcsvを出力する
MySQLでCSV出力しようとしたら --secure-file-priv option のエラーになった
MySQLでCSVファイルを使って結果出力やデータ入力を行う方法

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

DockerToolboxでOracle環境構築ではまったことメモ

容量足りないエラー

イメージ作成時に容量エラーとなる。
VMの仮想ディスクサイズを変更する。
とりあえず40GBくらいにしておきたい。

vmdkだと拡張できないのでvdiに複製してから拡張する。
複製&拡張はグローバルメニューから実施。

拡張後にvmdkに戻してアタッチするもVMが起動しないので、
拡張後のvdiのままでアタッチしてみたら起動した。

 共有フォルダのマウントがうまくいかない

[問題]
データ領域に共有フォルダをマウントしたいのだが何度やっても
下記のようにうまくいかない。

[oracle@2f26fe3ef960 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          37G  6.2G   29G  18% /
tmpfs            64M     0   64M   0% /dev
tmpfs           999M     0  999M   0% /sys/fs/cgroup
shm             4.0G     0  4.0G   0% /dev/shm
/dev/sda1        37G  6.2G   29G  18% /etc/hosts
tmpfs           1.8G  284M  1.5G  16% /opt/oracle/oradata
tmpfs           999M     0  999M   0% /proc/asound
tmpfs           999M     0  999M   0% /proc/acpi
tmpfs           999M     0  999M   0% /proc/scsi
tmpfs           999M     0  999M   0% /sys/firmware

[原因]
VM側のVirtualBoxの共有フォルダ設定ミス。
というかインストール後の初期設定で入るフォルダパスに"?"とか入っているのが問題。
変更後、default側で認識していることを確認すること。

DockerコンテナにOracle Database 19c をインストールして、Windows 側から接続
Dockerでファイル共有をするための、VirtualBoxの設定

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

Dockerコンテナ内部からホストにアクセスする方法

いつ使うのか?

Dockerコンテナを開発環境として、コンテナのホストOSで動いているサービスと通信したいときに、コンテナ内部からホストにアクセスするためのIPアドレスを調べる。

以下は、下記のDockerfileからビルドしたコンテナを具体例として説明する。

FROM ruby:2.6

RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN apt-get update -qq && \
    apt-get install -y vim

docker build --tag example-ruby-dev .

方法

OS X/Winの場合

公式のドキュメントによって、DockerのバージョンがCEの18.03以上の場合、"host.docker.internal"といったDNS名でデフォルトで設定されて。そうすると、下記のコマンドを使って、コンテナを立ち上げた上で、"Ping -a host.docker.internal"などの方法で、ホストのIPアドレスを調べる。

docker container run -it example-ruby-dev /bin/bash

Linuxの場合

Linux版のDockerでは、上述のようなデフォルト設定がまだないので、上記のコマンドを使って、コンテナを立ち上げた上で、以下のコマンドで、ホストのIPアドレスを調べる。

ip route show default | awk '/default/ {print $3}'

後書

ホストにアクセスするIPアドレスをDockerから発行することではなく、最初から特定な値で指定したい場合、@ijufumiさんの記事で述べた設定方法を参考してください。

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

Dockerコマンド - 基本操作

はじめに

Dockerでよく利用するであろうコマンドを、イメージ操作/コンテナ操作ごとに分けて簡単にメモりました。

・Dockreのバージョン : 19.03.6

イメージ操作系

・イメージ検索

docker search [options] <検索キーワード>

[options]
--limit=<検索結果表示数>
→表示する検索結果数を絞る

--filter stars=<最低スター数>
→スター数で検索フィルターをかける

・イメージ取得

docker image pull [options] <リポジトリ名[:タグ名]>

[options]
-a
→全てのタグを含むイメージ取得

・イメージ一覧

docker image ls [options]

[options]
-q
→イメージIDのみ表示

・イメージビルド

docker image build [option] -t <イメージ名[:タグ名]> <Dockerfileの配置ディレクトリ>

[option]
-f
→使用するDockerfileの名前を指定

-pull=true
→強制的にベースイメージを取得

・イメージタグ付け

docker image tag <元のイメージ名[:タグ名]> <新しイメージ名[:タグ名]>

・イメージ公開

docker image push <リポジトリ名[:タグ名]>

・イメージ削除

docker image rm [options] <イメージ名[:タグ名]>

[option]
-f
→強制的にイメージ削除

コンテナ操作系

・コンテナ作成

docker container run [option] <イメージ名[:タグ名]> <コマンド>

[option]
-d
→コンテナをバックグラウンドで実行

-i
→ホストの入力をコンテナの標準出力につなげる

-t
→コンテナの標準出力をホストの標準出力とつなげる

-p <ホストのポート番号>:<コンテナのポート番号>
→<ホストのポート番号>から<コンテナのポート番号>へポートフォワーディング

-v <ホスト側ディレクトリ>:<コンテナ側ディレクトリ>
→<ホスト側ディレクトリ>と<コンテナ側ディレクトリ>が共有される

--name <コンテナ名>
→コンテナに名前を付ける

・コンテナ一覧

docker container ls

[option]
-q
→イメージIDのみ表示

・実行中のコンテナ内でコマンド実行

docker container exec [option] <コンテナ名/コンテナID> <コンテナ内で実行するコマンド>

[option]
-d
→コマンドをバックグラウンドで実行

-i
→ホストの入力をコンテナの標準出力につなげる

-t
→コンテナの標準出力をホストの標準出力とつなげる

・コンテナ-コンテナ間/コンテナ-ホスト間でファイルコピー

docker container cp <ホストのコピー元 or コンテナ名:コンテナ内のコピー元> <コンテナ名:コンテナ内のコピー先 or ホストのコピー先>

・コンテナ停止

docker container stop <コンテナ名/コンテナID>

・現在のコンテナからイメージ作成

docker container commit <コンテナ名/コンテナID> <リポジトリ[:タグ名]>

・コンテナ再起動

docker container restart <コンテナ名/コンテナID>

・コンテナ削除

docker container rm <コンテナ名/コンテナID>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで構築するEthereum PET-SHOP TRUFFLE BOXES(その2)

その1からの続きでで、ETHEREUM PET SHOP チュートリアルをやっていきます。

Writing the smart contract

バックエンドとして動作するスマートコントラクト、Adoption.sol を作成していきます。

記述結果はこのようになります。

Adoption.sol
pragma solidity ^0.5.0;

contract Adoption {
    address[16] public adopters;

    // Adopting a pet
    function adopt(uint petId) public returns (uint) {
        require(petId >= 0 && petId <= 15);

        adopters[petId] = msg.sender;

        return petId;
    }

    // Retrieving the adopters
    function getAdopters() public view returns (address[16] memory) {
        return adopters;
    }

Compiling and migrating the smart contract

コンパイルは、

$ truffle compile

を叩きます。Docker環境の中で。これがポイント。

普通にやるのであれば、docker-compose up で起動中の環境を、Ctrl+Cで終了。
改めて、

$ docker-compose up -d

でバックグラウンド起動。
この状態で、Docker内のshellに入ります。
下記の、「truffle」は、docker-compose.yml で、services:の下で指定している名前。

$ docker-compose run truffle sh
/usr/src/app # 

こんな感じで表示されますので、truffle compile を実行します。

/usr/src/app # truffle compile
You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project

Compiling your contracts...
===========================
> Compiling ./contracts/Adoption.sol
> Artifacts written to /usr/src/app/build/contracts
> Compiled successfully using:
   - solc: 0.5.16+commit.9c3226ce.Emscripten.clang

成功です。

続いてマイグレーション。マイグレーションファイルを使って、ネットワークにデプロイします。

元々準備されている、migrations/1_initial_migration.js は、trrfle プロジェクトを作成した際に作られるもので、Migrations.sol をデプロイするということだけを書いているのですね。
そこで、Adoption.sol をデプロイするための、2_deploy_contracts.js を作ります。

やっている内容は、対象が違うだけで、1_initial_migration.js と同じです。

2_deploy_contracts.js
var Adoption = artifacts.require("Adoption");

module.exports = function(deployer) {
  deployer.deploy(Adoption);
};

マイグレートする前には、ganache が起動していることを確認しておきます。
RPC SERVER
HTTP://10.200.10.1:7545
です。
スクリーンショット 2020-03-29 19.48.47.png

そして、コンパイル時に、Docker環境に入っていると思いますので、実行します。

/usr/src/app # truffle migrate
You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.



Starting migrations...
======================
> Network name:    'development'
> Network id:      5777
> Block gas limit: 0x6691b7


2_deploy_contracts.js
=====================

   Deploying 'Adoption'
   --------------------
   > transaction hash:    0x60f8967bc9aff355dac281fe96576362ea57bcc8b461466ee6eb19e7df645b76
   > Blocks: 0            Seconds: 0
   > contract address:    0xb25D78Fc89CE462816Aa4596e93b9a31CAfC176E
   > block number:        7
   > block timestamp:     1585479243
   > account:             0xc55F3d6C444ca88f529F3413EDEd85a39e38609C
   > balance:             99.98329494
   > gas used:            239915
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0047983 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0047983 ETH


Summary
=======
> Total deployments:   1
> Final cost:          0.0047983 ETH

成功です。ganacheの画面でも、current block が増加し、最初のアカウントのetherが減少しています。

Testing the smart contract

次は、テストを書いていきます。テストは、JavaScript でも、Solidity でも書けるそうです。チュートリアルでは、Solidity で書いていきます。

Adoption.sol は、
- address[16] public adopters
- function adopt(uint petId) public returns (uint)
- function getAdopters() public view returns (address[16] memory)
のPublic 変数、Functionがありますので、それらをテストします。

チュートリアルに従って記述していくと、下記のようになります。

TestAdoption.sol
pragma solidity ^0.5.0;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol";

contract TestAdoption {
    // The address of the adoption contract to be tested
    Adoption adoption = Adoption(DeployedAddresses.Adoption());

    // Testing the adopt() function
    function testUserCanAdoptPet() public {
        uint returnedId = adoption.adopt(expectedPetId);

        Assert.equal(returnedId, expectedPetId, "Adoption of the expected pet should match what is returned.");
    }

    // Testing retrieval of a single pet's owner
    function testGetAdopterAddressByPetId() public {
        address adopter = adoption.adopters(expectedPetId);

        Assert.equal(adopter, expectedAdopter, "Owner of the expected pet should be this contract");
    }

    // Testing retrieval of all pet owners
    function testGetAdopterAddressByPetIdInArray() public {
        // Store adopters in memory rather than contract's storage
        address[16] memory adopters = adoption.getAdopters();

        Assert.equal(adopters[expectedPetId], expectedAdopter, "Owner of the expected pet should be this contract");
    }

    // The id of the pet that will be used for testing
    uint expectedPetId = 8;

    //The expected owner of adopted pet is this contract
    address expectedAdopter = address(this);

}

コンソールはDocker環境に入っていると思いますので、そこでテストを実行します。

/usr/src/app # truffle test
You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project
Using network 'development'.


Compiling your contracts...
===========================
> Compiling ./test/TestAdoption.sol
> Artifacts written to /tmp/test-2020229-61-u4mbmv.pjgpm
> Compiled successfully using:
   - solc: 0.5.16+commit.9c3226ce.Emscripten.clang



  TestAdoption
    ✓ testUserCanAdoptPet (140ms)
    ✓ testGetAdopterAddressByPetId (147ms)
    ✓ testGetAdopterAddressByPetIdInArray (164ms)


  3 passing (10s)

成功しました。

Creating a user interface to interact with the smart contract

では、UIの作成に入っていきます。

(いったん公開して、その3に続けていきます。)

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

docker-composeで起動してるMySQLがうまく終了しなくなってたのを直した

概要

私が頻繁に使っているローカル開発環境用の docker-compose.yml に含まれるMySQLが気づいたらちゃんと終了しなくなっていて、たまにデータをぶっ壊していたから直しました。

原因

mysqlコンテナを command: bash-c 'ほげほげ' で起動していたら、PID1で起動するもんで、終了時のkillをうまくハンドリングできずに、mysqlのプロセスまでkillが届かず落ちなくて、タイムアウトでホストから落とされていた(データ壊す危険)。

docker-compose.ymlにやったこと

initオプションを指定して /dev/ihit 越しに起動してあげればこいつがちゃんとハンドリングしてくれます。
3.5だったので、3.7へバージョン上げて、下記のように init: true を指定しました。

version: '3.7'
services:
  mysql:
    image: mysql:5.7
    init: true
    command: bash -c '
      touch /var/log/mysql/general.log &&
      chown mysql:mysql /var/log/mysql/general.log &&
      tail -f /var/log/mysql/general.log &
      /entrypoint.sh mysqld
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --general-log=true
      --general-log-file=/var/log/mysql/general.log
      --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
      --innodb-use-native-aio=0'

before

指定していなかった時代

root@4b13f5625011:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:53 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
root         7     1  0 05:53 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
mysql        8     1  5 05:53 ?        00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0
root        14     7  0 05:53 ?        00:00:00 tail -f /var/log/mysql/general.log
root        65     0  0 05:53 pts/0    00:00:00 bash
root        71    65  0 05:53 pts/0    00:00:00 ps -ef

after

指定した時代

root@8771d0333475:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:00 ?        00:00:00 /sbin/docker-init -- docker-entrypoint.sh bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-
root         7     1  0 06:00 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
root         9     7  0 06:00 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
mysql       10     7  2 06:00 ?        00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0
root        13     9  0 06:00 ?        00:00:00 tail -f /var/log/mysql/general.log
root        67     0  1 06:00 pts/0    00:00:00 bash
root        73    67  0 06:00 pts/0    00:00:00 ps -ef

結果

こうするとホストから Ctrl + Cを叩き込んでもタイム・アウトすることなく、素直に落ちてくれるようになりました。

参考

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

[Docker] PHP 5.6 + MySQL 5.6の環境をDockerで作る方法

PHP 5.6 + MySQL 5.6の環境をDockerで作る方法

こんにちは、ITエンジニアの田中です。
今回は、PHP 5.6 + MySQL 5.6の環境をDockerで作る方法を説明します。

この記事の対象者

PHP7.4がすでにリリースされているこの2020年に、
2014年8月28日リリースされたPHP5.6の環境が必要になった希少なあなたに向けて書いた記事です。
過去のアプリケーションのリファクタリングをするときには有益です。

構築される環境

  • PHP 5.6.40
  • Apache/2.4.25 (Debian)
  • mysql Ver14.14 Distrib 5.6.47

前提環境

  • dockerインストール済み

私の環境
- mackbook

フォルダ構成

root/
 ├ app/
 │ └ public (Web公開されるパス)
 ├ config/
 │ └ php/php.ini (phpで使用する設定ファイル)
 ├ data/ (mysqlのデータ)
 ├ initdb.d (コンテナーを作成するときに実行されるSQL)
 └ docker-compose.yml
 └ Dockerfile

Apache設定ファイルを取得・変更

Apacheの設定を変更し、公開フォルダを変更します。

■ 変更前
/var/www/html

■ 変更後
/var/www/html/public

下記の記事を参考にしてください。
https://qiita.com/eidera/items/19decbfc290b4776cfc3

Dockerfileの作成

下記のDockerfileの内容をコピーして作成してください。

FROM php:5.6-apache

# PHPのインストール
RUN apt-get update \
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        openssl libssl-dev \
        libxml2-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql mbstring xml tokenizer zip \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install mysql \
    && pear channel-update pear.php.net \
    && pear upgrade-all \
    && pear config-set auto_discover 1 \
    && pear install DB 

# apacheのrewriteを有効にする
RUN cd /etc/apache2/mods-enabled \
    && ln -s ../mods-available/rewrite.load

COPY /config/php/php.ini /usr/local/etc/php/php.ini

WORKDIR /var/www/html

docker-compose.ymlの作成

下記のdocker-compose.ymlの内容をコピーして作成してください。

web:
    container_name: web
    build: .
    ports:
     - "80:80"
    environment:
      # bargeでは、/usr/local/binも追加しておかないと起動できない。
      PATH: ${PATH}:/usr/local/bin:/root/.composer/vendor/bin
    volumes:
      - ./app:/var/www/html
      - ./config/apache2/sites-available:/etc/apache2/sites-available
    links:
      - db

db:
    image: mysql:5.6
    container_name: mysql5.6
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --init-connect="SET NAMES utf8" --innodb_file_per_table=1 --innodb_file_format=BARRACUDA
    environment:
        MYSQL_ROOT_PASSWORD: rootpassword
        MYSQL_DATABASE: libary_beauty
        MYSQL_USER: local
        MYSQL_PASSWORD: password    
    volumes:
        - "./data:/var/lib/mysql"
        - "./initdb.d:/docker-entrypoint-initdb.d"
    ports:
        - "13306:3306"

テスト用のPHPファイル

下記のtest.phpの内容をコピーして作成してください。
そして、app/publicの下に置いてください。

<?php
  echo "<h1>これはテストです!</h1>";

buildして起動

> docker-compose build
> docker-compose up

テスト実行

下記のURLにアクセスしてください!
http://localhost/test.php

太字で表示されれば成功です!

私の環境での表示イメージをです!
FireShot Capture 052 -  - localhost.png

終わりに

わかりにくい部分があれば、コメントください!

これからも役立つ情報を公開していくのフォローお願いします!

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

Docker上に動画エンコード環境を作るまで(CMcut4U)

はじめに

普段はWindows10上にavisynthととaviutilを利用して自動CMカットバッチをキックしつつtsファイルのエンコードを行っているが、動画エンコード部分を別PCに切り出せないかなと思い、色々と試行錯誤したメモ書き。

CMカットもしたいため、まずはPCを購入する前にVMWare上に環境を作成し実験した。
CMcut4Uを使用させていただいた。
このプログラムはフレーム単位のカットではなく秒単位のカットとなっているため、CMがほぼ一定フレーム残る仕様となっている。

環境情報

Windows10 Home
CPU: i7-7700 CPU @3.60GHz
メモリ: 16.0GB

VMWare 14
Tera Term 4.86
Xming 6.9.0.31
WinSCP 5.5.4

ubuntuのCPU等の割り振りは以下の通り。
ubuntu.PNG

環境構築

インストール方法は省略。少なくともWindowsから操作したい場合はTera Term、Xming、WinSCPは必須(代替製品でもOK)。

Ubuntuのインストール

同じく省略。適宜ユーザを作成。

Ubuntuの設定

この項ではまだTeratermからの接続はできないため、Ubuntu上から設定を行う。

rootユーザのパスワード設定

作成したユーザにてログインし、下記コマンドでrootユーザのパスワードを設定する。

$ sudo passwd root

ssh許可

Windowsからsshで接続できるようにするための設定。
まずはパッケージをインストール。

apt-get update
apt-get install aptitude
aptitude install ssh

インストール後、/etc/ssh/sshd_configに「PermitRootLogin yes」を追記

vi /etc/ssh/sshd_config 
PermitRootLogin yes

sshを再起動

/etc/init.d/ssh restart

以降で特筆しない限りrootユーザでの作業とする。

Teraterm、Xmingの設定

この項はTeratermから操作をするための設定。Teratermを利用しない場合はスキップ可能。

Teratermの設定

設定 -> SSHポート転送 より、「Xクライアントアプリケーションの転送」にチェックを入れる。
Teraterm_XmingSetting.PNG

設定 -> 設定の保存 より、設定情報を保存。

Xmingの設定

Xmingをインストールしたフォルダ内の「X0.hosts」を編集する。
デフォルトでは「localhost」のみが設定されているため、構築したUbuntuのIPを追記する。

X0.hosts
localhost
192.168.xxx.xxx

設定後、Xmingを再起動。

Ubuntuの設定

出力ディスプレイの設定を行う。
ログオフしても設定が消えないよう「.bashrc」にDISPLAY設定を追記する。
追記するIPはWindowsマシンのIPを追記する。

# cat export DISPLAY=192.168.yyy.yyy:0 >> /root/.bashrc

Xmingの動作確認

Teratermにて新しいセッションでUbuntuにログインする。
その後デフォルトでインストールされているであろうfirefoxを起動してみる。
(GUIを利用しているアプリケーションならなんでもいい)

# firefox &

WindowsマシンにFirefoxが表示されれば設定完了。
Xming_firefox.PNG

Docker、Docker-composeのインストール

Dockerのインストール

ここではstableをインストールする。

# apt-get update
# apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# apt-key fingerprint 0EBFCD88
# add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# apt-get install -y docker-ce

インストール後にバージョン情報が表示されれば成功。

# docker --version
Docker version 19.03.8, build afacb8b7f0

Docker-composeのインストール

インストールするバージョンによりパスが異なるため、リリース情報より予め確認すること。
下記コマンドはversion 1.26.0-rc3をインストールする場合のものとなる。

Docker-compose_1.26.0-rc3
# curl -L https://github.com/docker/compose/releases/download/1.26.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

インストール後にバージョン情報が表示されれば成功。

# docker-compose --version
docker-compose version 1.26.0-rc3, build 46118bc5

dockerfile、docker-composeを作成

まずはベースとなるディレクトリを作成する。今回は「/data/encoder」とする。

# mkdir -p -m 775 /data/encoder/volumes/work_area
# touch /data/encoder/docker-compose.yml
# touch /data/encoder/encoder

dockerfile

必要なソフトウェアをインストールしたりビルドしたりしているだけ。不要なファイル、ディレクトリは最後に削除。
apt-getでは人がわかりやすいように敢えて分けている。

一部設定を変更する必要があるため、設定ファイル(/opt/CMcut4U/const.rb)をsedで置換している。
設定ファイルのバックアップは取っていないため、必要であれば追記すること。

FROM ubuntu:18.04

LABEL version="1.0"
LABEL description="動画エンコード用サーバ"

WORKDIR /var/tmp

#作業用ディレクトリを作成
#日本語フォントをインストール
#Rubyのインストール
#wav-file(Ruby)のインストール
#pythonのインストール
#ffmpeg & mpvのインストール
#opencvのビルド&インストール
#CMcut4Uをインストール
#ゴミ掃除
RUN mkdir -m 775 /work_area && \
    apt-get update && \
    apt install -y fonts-takao && \
    fc-cache -fv && \
    apt install -y ruby && \
    apt install -y ruby-gtk2 && \
    gem install wav-file && \
    apt install -y python-dev python-numpy && \
    apt install -y ffmpeg && \
    apt install -y mpv && \
    apt install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev && \
    apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev && \
    mkdir -m 775 /work_area/opencv && \
    git clone https://github.com/opencv/opencv.git /work_area/opencv && \
    mkdir -m 775 /work_area/opencv_contrib && \
    git clone https://github.com/opencv/opencv_contrib.git /work_area/opencv_contrib && \
    cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local /work_area/opencv && \
    make && \
    make install && \
    mkdir -m 775 /opt/CMcut4U && \
    git clone https://github.com/kaikoma-soft/CMcut4U.git /opt/CMcut4U && \
    echo PATH="$PATH:/opt/CMcut4U" >> /root/.bashrc && \
    mkdir -m 775 /work_area/video /work_area/mp4 /work_area/logo /work_area/work /work_area/TS && \
    cat /opt/CMcut4U/const.rb | sed -i -e 's/1280x720/1920x1080/g' /opt/CMcut4U/const.rb && \
    cat /opt/CMcut4U/const.rb | sed -i -e 's/Top       =.*/Top       = "\/work_area"/g' /opt/CMcut4U/const.rb && \
    cat /opt/CMcut4U/const.rb | sed -i -e 's/$ffmpeg_bin      =.*/$ffmpeg_bin      ="ffmpeg"/g' /opt/CMcut4U/const.rb && \
    rm -rf /work_area/opencv/* && \
    rmdir /work_area/opencv && \
    rm -rf /work_area/opencv_contrib/* && \
    rmdir /work_area/opencv_contrib && \
    rm -rf /var/tmp/*

docker-compose

dockerファイルに「encoder」を指定している。
一部ウィンドウにて設定する必要があるため、Display情報を引っ張ってきている。
DISPLAYに設定するIPはwindowsホストのIPを指定すること。

docker-compose.yml
version: '3'

services:
  container1:
    build:
      context: .
      dockerfile: encoder
    environment:
      - DISPLAY=192.168.XXX.XXX:0
    volumes:
      - ./volumes/work_area:/work_area
      - /tmp/.X11-unix:/tmp/.X11-unix
    tty: true
    command: bash -c "/bin/bash"

イメージビルド

dockerファイルを見るとわかる通り、opencvをビルドしているためそれなりの時間がかかる。

cd /data/encoder
docker-compose build

起動 & ログイン

ビルドまで完了したので、あとは起動して中に入るだけ。

cd /data/encoder
docker-compose up
docker-compose start
docker exec -it encoder_container1_1 /bin/bash

tsファイル、出力されるファイルについて

上記設定を実施すると、全て「work_area」上で完結するようになっている。

ホストのubuntu上では下記の通り。

/data/encoder/volumes
    └─/work_area
          ├─/logo   ・・・ロゴファイルを配置するディレクトリ
          ├─/mp4    ・・・エンコードされたファイルが保存されるディレクトリ
          ├─/TS     ・・・エンコード対象を配置するディレクトリ
          ├─/video  ・・・利用しない
          └─/work   ・・・エンコード中に利用されるディレクトリ

TSファイルを配置する場合はTSディレクトリ配下に配置するのだが、直接ファイルを配置するとうまく動作しない。
必ず「~/TS/番組名/xx.ts」となるようにすること。

/data/encoder/volumes
    └─/work_area
          ├─/TS     ・・・エンコード対象を配置するディレクトリ
          |   └─/BANGUMI_A
          |        └─/hogehoge.ts
          ・
          ・
          ・

ロゴファイルの作成

一旦「cmcuterAll.rb」を実行する。この時ロゴファイルの存在しないため、エラーで止まる。

# cmcuterAll.rb

その後、作者様のサイトの通り、ロゴファイルを作成する。
ここでディスプレイを使った操作があるが、上記設定によりWindowsホスト上にスクリーンが表示される。

なお、この環境でのロゴ作成コマンドは下記となる。

# logoAnalysisSub.py --dir /work_area/BANGUMI_A/BS11_isekai/SS

再度「cmcuterAll.rb」を実行すればエンコードが開始される。

# cmcuterAll.rb

エンコード時間とか

15分のアニメを実行した結果、下記の通りとなった。

エンコード時間 容量 CMカット率
約24分 1.9GB -> 93.2MB

仕様通り、CMカット処理は秒単位での処理となっているため数フレームずつCMが残っている。
一方、CM部分が丸々残るということはなかった。
仮にCM部分が丸々残る場合は「fixGUI.rb」を使って手直しをすることができる。
fixGUI.PNG

また、cmcuterAll.rbのオプションにて、エンコードはせずcmカットに必要な計算までで止める機能もある。
これを前提にすれば無駄にエンコード時間を使わずに済む。

オプションについては作者様のサイト参照のこと。

まとめ

TSファイルをエンコードする環境をDockerファイルに構築することができた。
常にDocker環境を動かす必要性は全く無いので、親となっているubuntuでshell+cron使って定期バッチにし、TSディレクトリにtsファイルがある場合のみDocker起動してcmcuterAll.rbをキックする・・・くらいでいいと思う。

参考/配布先

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

Docker+Git Hub+VSCodeだけで仮想環境を完結させる

Dockerの環境作りが出来たので忘れないうちに記事にします。
いちからDocker+Git Hub+VSCodeで環境を全部GitHubに乗せてみました。
これでいつPCがぶっ壊れても大丈夫ですね。

イメージ図

全体像はこんな感じ
ローカルとDockerでプログラムやgitのコピーも考えたのですが、面倒だったのでこうしました
image.png

環境

macOS Catalina 10.15.3

あるとよい前提知識

git/GitHub
VSCode

Dockerのインストール

公式サイトからDockerのアカウントを作ってログインし、DockerHubからダウンロードしてインストールします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac

詳しくはこちらで
参考:https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

GitHubのSSH認証

SSH認証を使うので、公開鍵を登録しておきましょう。

詳しくはこちらで
参考:https://qiita.com/shizuma/items/2b2f873a0034839e47ce

Dockerfileの作成

DockerfileというものでDocker は作られます。
今回のDockerfileはこちら。ちなみに拡張子はありません。
Dockerfile

FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y python3
RUN apt-get install -y python3-pip

COPY requirements /root/python/requirements
RUN pip3 install -r /root/python/requirements/common.txt

ベースがUbuntu
pythonなどをインストール
requirementsのフォルダをDockerにコピーして
それを参照してpip installを実行
というファイルになります。

requirementsは普通にpip installで参照する形式

GitHubに公開しているので
git clone git@github.com:XM03/docker-test.git
でもOK

このファイルを元にDockerのモト(Docker image)を作ります

Dockerを使う

ターミナルを開いて先ほどのDockerfileのあるディレクトリに行って


docker build . -t docker_test
# . で現在ディレクトリのDockerfileを参照 -tでタグ付け

でdocker image(仮想環境)をビルドします。

docker run -it docker_test bash
# -itは入力を受け付けターミナルを表示 bashはおまじない

でdockerを動かします。

SSH鍵のコピー

ファイルのコピーはローカル→Dockerが
docker cp local_dir ID:docker_dir
Docker→ローカルが
docker cp ID:docker_dir local_dir
です。

まず先ほどと別窓でターミナルを開いて

docker ps

でContainerIDを確認します

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
dc46470c4b2c        docker_test         "bash"              16 minutes ago      Up 16 minutes       0.0.0.0:5000->5000/tcp   zen_heisenberg
a49624f5e200        ubuntu              "/bin/bash"         5 hours ago         Up 5 hours                                   elastic_leakey

左にあるのがID

IDは基本的に最初の1~3文字だけ使います
IDがa49624f5e200だった場合は

docker cp ~/.ssh/. a4:/root/.ssh

と入力してSSHのKEYをローカルPCからdockerに移動します。
このように.を使うと複数選択できます。
これでDockerからGitHubにアクセス出来ます。

※DockerfileでCOPYしても同じ事がさらに簡単に出来ますが
imageに秘密鍵が残るのが嫌だったので今回は不採用としました。

あとは通常と同様にgit cloneします
もちろん他のコマンドも同様に使えます

今回はこれを使ってみます。

cd root
git clone git@github.com:XM03/docker-test.git
cd docker-test
python3 test.py
Hello World!
python ver:3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
flask ver:0.12.2

無事pythonもflaskもインストールできている事が確認できるかと思います。

あとはVSCodeで編集できればミッションコンプリートですね

Bad ownerって出たら

git cloneでBad ownerって出たら
以下を打ち込めば上手く動くかと思われます。

chown root ~/.ssh/config

参考:https://stackoverflow.com/questions/51744040/docker-bad-owner-or-permissions-on-root-ssh-config

VSCode

Docker
Remote - Containers
の拡張機能をダウンロードします。

Dockerのタブで動いているDockerが表示されているのでAttach Visual Studio Codeを選ぶと
開くことができます。

Screen Shot 2020-03-29 at 5.58.39.png

あとはworkspaceに追加してあげればOKです。
rootで追加すると色々見やすくて良いです。

先ほどのファイルがあるので、それを編集すればOKです
Dockerを閉じると全てのデータは消えるので必ずpushしましょう
逆にいうと必ずpushする癖がつくはずです。

以上でミッションコンプリートとなります。

FLASKでHello World!の表示までやってみる

環境変数とgit cloneを加えてDockerfileを以下のようにします。
ちなみにDockerはキャッシュを積極的に使い、GitHubの更新が反映されないためgit cloneをここに入れるのはあまり推奨されない。
今回はほとんど更新がない奴なのでOK。

Dockerfile

FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y python3.7
RUN apt-get install -y python-pip

COPY requirements /root/python/requirements
RUN pip install -r /root/python/requirements/common.txt

ENV FLASK_APP=hello.py
ENV FLASK_DEBUG=1

RUN git clone https://github.com/miguelgrinberg/flasky.git

プログラムはO`REILLYの教科書から参照します。
三章のaのプログラム(Hello World)を使います

docker build . -t docker_test  

buildは同じ

docker run -it -p 5000:5000 docker_test bash

-p:portを5000で固定し動かします。

root@dc46470c4b2c:/# ls
bin  boot  dev  etc  flasky  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@dc46470c4b2c:/# cd flasky
root@dc46470c4b2c:/flasky# git checkout 3a #三章のaプログラム
~~
略
~~
HEAD is now at e020af8 Chapter 3: Templates (3a)
root@dc46470c4b2c:/flasky# flask run --host 0.0.0.0
 * Serving Flask app "hello"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 295-074-713

ホストを0.0.0.0にしないと外部からアクセス出来ないようなので指定しています。

あとはローカルのブラウザでhttp://localhost:5000を打ち込むと
Hello World!という文字を見ることが出来ます。
他の章のプログラムにするともう少し面白いかも知れませんね。

おわりに

上記の流れで行えば動くはずです.いろいろ至らないところがあるかもしれませんが,その点はコメント等で指摘してくれると嬉しいです。

その他

Dockerの勉強はUdemyのこれがおすすめ。
英語も一緒に学べる。
https://www.udemy.com/course/learn-docker/learn/lecture/11057896

VSCodeをjupyternotebookのように使える方法
https://qiita.com/surei/items/9f25d7efa7c67d55d98f

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

Docker+Git Hub+VSCodeだけで作る仮想環境を完結させる

Dockerの環境作りが出来たので忘れないうちに記事にします。
いちからDocker+Git Hub+VSCodeで環境を全部GitHubに乗せてみました。
ウェブ系じゃないけどDockerやってみたいって人向けの記事かも知れません。

イメージ図

こんな感じで環境ごとGitHubに乗せちゃって
いつでもどこでも誰のPCでもベストな環境でプログラミング出来ちゃうって奴です。
image.png

環境

macOS Catalina 10.15.3

多少の前提知識

git/GitHub
VSCode

Dockerのインストール

公式サイトからDockerのアカウントを作ってログインし、DockerHubからダウンロードしてインストールします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac

詳しくはこちらで
参考:https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

GitHubのSSH認証

SSH認証を使うので、keyを登録しておきましょう。

詳しくはこちらで
参考:https://qiita.com/shizuma/items/2b2f873a0034839e47ce

Dockerfileの作成

DockerfileというものでDocker は作られます。
今回のDockerfileはこちら。ちなみに拡張子はありません。
Dockerfile

FROM ubuntu

RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y python3
RUN apt-get install -y python-pip

COPY requirements /root/python/requirements
RUN pip install -r /root/python/requirements/common.txt

ベースがUbuntu
pythonなどをインストール
requirementsのフォルダをDockerにコピーして
それを参照してpip installを実行
というファイルになります。

requirementsは普通にpip installで参照する形式でOK。

このファイルを元にDockerのモト(Docker imageを作ります)

Dockerを使う

ターミナルを開いて先ほどのDockerfileのあるディレクトリに行って


docker build . -t docker_test
# . で現在ディレクトリのDockerfileを参照 -tでタグ付け

でdocker image(仮想環境)をビルドします。

docker run -it docker_test bash
# -itは入力を受け付けターミナルを表示 bashはおまじない

でdockerを動かします。

SSH KEYのコピー

ファイルのコピーはローカル→Dockerが
docker cp local_dir ID:docker_dir
Docker→ローカルが
docker cp ID:docker_dir local_dir
です。

まず先ほどと別窓でターミナルを開いて

docker ps

でContainerIDを確認します

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
dc46470c4b2c        docker_test         "bash"              16 minutes ago      Up 16 minutes       0.0.0.0:5000->5000/tcp   zen_heisenberg
a49624f5e200        ubuntu              "/bin/bash"         5 hours ago         Up 5 hours                                   elastic_leakey

左にあるのがID

IDは基本的に最初の2,3文字だけ使います
IDがa49624f5e200だった場合は

docker cp ~/.ssh/. a4:/root/.ssh

と入力してSSHのKEYをローカルPCからdockerに移動します。
このように.を使うと複数選択できます。
これでDockerからGitHubにアクセス出来ます。
※DockerfileのCOPYを使うとimageに秘密鍵が残るのであんまり良くなさそう??
そうじゃなければそっちのが楽

あとは通常と同様にgit cloneします
もちろん他のコマンドも同様に使えます
あとはVSCodeで編集できればミッションコンプリートですね

VSCode

Docker
Remote - Containers
の拡張機能をダウンロードします。

Dockerのタブで動いているDockerが表示されているのでAttach Visual Studio Codeを選ぶと
開くことができます。

Screen Shot 2020-03-29 at 5.58.39.png

あとはworkspaceに追加してあげればOKです。
rootで追加すると色々見やすくて良いです。

git cloneしたファイルがあるので、それを編集すればOKです
Dockerを閉じると全てのデータは消えるので必ずpushしましょう
逆にいうと必ずpushする癖がつくはずです。

以上でミッションコンプリートとなります。

※なんか標準機能で色々もっと簡単に出来そうかも

FLASKでHello World!の表示までやってみる

環境変数とgit cloneを加えてDockerfileを以下のようにします。
ちなみにDockerはキャッシュを積極的に使うので、更新が反映されないためgit cloneをここに入れるのはあまり推奨されない。

Dockerfile

FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y python3.7
RUN apt-get install -y python-pip

COPY requirements /root/python/requirements
RUN pip install -r /root/python/requirements/common.txt

ENV FLASK_APP=hello.py
ENV FLASK_DEBUG=1

RUN git clone https://github.com/miguelgrinberg/flasky.git

プログラムはO`REILLYの教科書から参照します。
三章のaのプログラム(Hello World)を使います

docker build . -t docker_test  

buildは同じ

docker run -it -p 5000:5000 docker_test bash

-p:portを5000で固定し動かします。

root@dc46470c4b2c:/# ls
bin  boot  dev  etc  flasky  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@dc46470c4b2c:/# cd flasky
root@dc46470c4b2c:/flasky# git checkout 3a #三章のaプログラム
~~
略
~~
HEAD is now at e020af8 Chapter 3: Templates (3a)
root@dc46470c4b2c:/flasky# flask run --host 0.0.0.0
 * Serving Flask app "hello"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 295-074-713

ホストを0.0.0.0にしないと外部からアクセス出来ないようなので指定しています。

あとはローカルのブラウザでhttp://localhost:5000を打ち込むと
Hello World!という文字を見ることが出来ます。
他の章のプログラムにするともう少し面白いかも知れませんね。

Dockerの勉強

Udemyのこれがおすすめ。
英語も一緒に学べる。
https://www.udemy.com/course/learn-docker/learn/lecture/11057896

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

Folding@Home をコンテナで動かす

はじめに

コロナウィルスの蔓延で先の見えない不安が続いていますが、
Folding@Homeというプロジェクトを、ASRock JapanさんがTwitterで紹介されていて、
少しでも貢献できればとはじめてみました。

https://twitter.com/AsrockJ/status/1243107649094184960

Folding@Homeの詳しい紹介はこちらをご覧ください。

ネイティブのクライアントもありますが、Dockerコンテナも提供されており、
今回はDockerにて参加する方法を記載します。

https://github.com/johnktims/folding-at-home

手順

  • 適当なディレクトリに以下のファイルを用意します。
    • Dcokerがインストールされ利用できる前提です。
docker-compose.yaml
version: '3.7'
services:
  folding-at-home:
    image: johnktims/folding-at-home
    restart: always
    ports:
      - 7396:7396
    command: >
   ## --user=ユーザー名(登録する場合はコメントを解除)
      --team=252872
   ## ASRock Japan さん が開設されているチームです。
      --gpu=false
      --smp=true
      --power=full
      --client-type=advanced
  • docker-compose.yaml を設置したディレクトに移動します。

  • docker-compose up -d と実行

  • ブラウザよりhttp://127.0.0.1:7396/にアクセスすると稼働状況が確認できます。

以上で細々とですが処理が実行されていきます。
ひとつひとつは小さな力かもしれませんが、多くの人が集まれば大きな力になります。

参考URL

https://qiita.com/Tayu0404/items/97fee464c58080b6c682
https://qiita.com/sot528/items/405daa9574e9c3a80841

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