- 投稿日:2020-09-26T21:06:16+09:00
Circle CIのDockerコンテナにsshでアクセスしてデバッグする
はじめに
ローカルではパスするテストがCircleCiではパスしない、ということがあったので、CircleCiのコンテナにsshでつないでデバッグをしました。
おおむね、公式通りなのですが、補足も必要なところもあるかと思うので、その時の手順を残しておきます。
windows環境ですので悪しからず。前提
- sshは使用できず状態になっている前提です。
- まだの場合はこちらなどを参考に入れてみてください。
- githubとCircleCiもアカウントは持っている前提です。
準備
CircleCiにsshで接続するには、githubにsshで接続できる状態になっている必要があります。
こちらを参考に設定をすると良いかと思います。デバッグ対象のコンテナをsshを有効にして再起動
CircleCiにアクセスし、デバッグしたいJobの"Rerun Job With SSH"を選択する。
WorkFlowではなくJobを選択する必要があります。以下のようにEnable SSHのステップが追加されてワークフローが開始されます。
以下の白枠の箇所にポート番号とホストのipアドレスが表示されますのでこれを使ってsshでコンテナに接続していきます。sshでコンテナに接続
先ほど表示された情報をもとにsshでコンテナに接続します。
途中で接続するか聞かれたらyesと答えておけば良いです。ssh -p <port> <ip address>これでコンテナに接続した状態になるはずなので、いろいろデバッグに必要な情報が取れると思います。
また、ローカルに戻った状態で以下のようなscpを使ったりしてコンテナのファイルやディレクトリをダウンロードしたりもできます。scp -r -P <port> root@<ip address>:<コピーしたいディレクトリのパス> <ローカルのダウウンロード先のパス>終わりに
Dockerを使ってても、ちょこちょこローカルとCircleCiでの結果が異なることがあり、その際にデバッグしたりしています。そもそもデバッグがいらなくなるようDockerやOSについても学んでいきたいなーと思います。
- 投稿日:2020-09-26T20:47:43+09:00
docker-composeを用いたRailsのAPIサーバー環境構築
筆者について
ProgateのRuby, Railsコースを一通りやった。
その後Dockerで環境作ってRailsでAPIサーバー作った。本記事について
Progateではviewを含んだrailsの書き方を学んだが、APIサーバーとしてのみRailsを使いたかった。
また、dockerで開発したかったため公式のクイックスタートを参考にRailsの開発環境を作った。
その過程で得られたノウハウをまとめる。APIサーバーの開発で使うGemについては別記事で書く。
前提
Docker, docker-composeの使い方がわかること
環境
Ruby 2.7
MySQL 5.7
VSCode
Mac 10.14.5
Sequel Pro データベース見る用Rails new するまで
まずはプロジェクトフォルダを作成。ここではrails-sampleとした。
そして、この直下に Dockerfileを作成FROM ruby:2.7 RUN apt-get update -qq && apt-get install -y RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]次にrailsをインストールするためのGemfileを用意
source 'https://rubygems.org' gem 'rails', '~>5'空のGemfile.lockを作る
touch Gemfile.lockDockerfileに記載されている
entrypoint.sh
を作るentrypoint.sh#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"なぜこれらのファイルを作るのかはDocker 公式クイックスタートの方を見ていただければ。
docker-compose.yml
を作るdocker-compose.ymlversion: '3' services: server: build: . tty: true volumes: - .:/myapp working_dir: /myapp ports: - "3000:3000" depends_on: - mysql command: bash # command: > # bash -c "rm -f tmp/pids/server.pid && # bundle exec rails s -p 3000 -b '0.0.0.0'" mysql: image: mysql:5.7 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql volumes: - "./mysql/db-data/:/var/lib/mysql" # データ永続化 - "./mysql/my.cnf:/etc/mysql/conf.d/my.cnf" # 日本語をデータとして使うために必要MySQLのデータの永続化と日本語対応のために
rails-sample > mysql > db-data フォルダを作成。
mysqlフォルダ以下にmy.cnf
を作成my.cnf[mysqld] character-set-server=utf8それができたら
rails new
する。docker-compose run server rails new . -MC --force --api --database=mysql --skip-active-storagerailsコマンドやコマンドのヘルプでオプションを調べ、不要そうなものを省いている。
重要なオプションは以下--force // rails new 時にファイルを上書き --api // api開発に不要なviewとかを生成しない --database=myql // デフォルトではsqliteだがmysqlを指定するこれでいろいろ作られる。
で、ここで
Gemfile
とGemfile.lock
が上書きされて新しくなっている。
これをイメージのほうに反映させるために、docker-compose buildする必要がある。
事前に必要なgemがわかっている場合にはここでGemfileに書いておく。
これでrails new完了
mysqlに繋がるように設定ファイルを書く。
config > database.yml
database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: mysql development: <<: *default host: mysql database: myapp_development ... test: <<: *default host: mysql database: myapp_testproductionは不要なのでまるっとコメントアウトした
host名はdocker-compose.yml
のサービス名
passwordもdocker-compose.yml
で指定したものできたら
docker-compose up -d
でコンテナを起動し、VSCodeのAttach Shellで中に入るrails db:createでDBを作る
root@dc075120af8a:/myapp# rails db:create ... Created database 'myapp_development' Created database 'myapp_test'これでデータベースが作れた。
Sequel Proで接続すればデータベースができていることが確認できるあとはProgateで学んだ通りモデル作ってマイグレーションすればテーブルができる。
参考
Docker 公式クイックスタート 英語
日本語の方は内容が古いので注意。
- 投稿日:2020-09-26T19:45:01+09:00
CentOS7・CentOS8のDockerコンテナの日本語化および日本時間設定
結論
以下のDockerfileをビルドすれば、言語が日本語でタイムゾーンが日本時間のコンテナができます。
〇 CentOS7
FROM centos:7 RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \ yum -y update && \ yum clean all && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ENV LANG="ja_JP UTF-8" \ LANGUAGE="ja_JP:ja" \ LC_ALL="ja_JP.UTF-8" \ TZ="Asia/Tokyo"〇 CentOS8
FROM centos:8 RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \ dnf -y upgrade && \ dnf -y install glibc-locale-source && \ dnf clean all && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ENV LANG="ja_JP UTF-8" \ LANGUAGE="ja_JP:ja" \ LC_ALL="ja_JP.UTF-8" \ TZ="Asia/Tokyo"環境
使い方・確認
上記Dockerファイルがあるディレクトリでコンテナイメージをビルドします。
その後コンテナを立てて、date
で日本語化とタイムゾーン設定が反映されていることを確認します。〇CentOS7
$ docker build -t centos:7-ja . $ docker run -dit --name centos7-ja centos:7-ja $ docker exec centos7-ja date 2020年 9月 26日 土曜日 19:37:24 JST〇CentOS8
$ docker build -t centos:8-ja . $ docker run -dit --name centos8-ja centos:8-ja $ docker exec centos8-ja date 2020年 9月 26日 土曜日 19:42:03 JST余談
日本語化に必要な設定を把握したくて作りました。
以下は作業してるうちに知ったことのメモです。
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
の意味
rpmパッケージの署名です。rpmパッケージの完全性を確認するために必要です。これを実施していないと、yum update
で以下のようなwarningが出る可能性があります。
とはいえエラーが出たところで勝手に上記と同様の操作をしてくれるので、必ず書かなければいけない訳ではありません。不必要なエラーでびっくりしないために実施しています。warning: /var/cache/yum/x86_64/7/updates/packages/bind-license-9.11.4-16.P2.el7_8.6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
yum clean all
の意味
yum update
で生成されたキャッシュをクリアします。以下に示す通り、yum clean all
をやるかやらないかでイメージサイズが全然違います。両者の違いはyum clean all
を行ったか否かのみです。
今回の記事ではyum update
にくっつけましたが、最後のyum update
およびyum install
より後にないと意味がないので、RUN
コマンドの最後の方に置いておくとメンテが必要になりにくくて良いかと思います。$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7-ja-without-clean 3f6ba3d02f45 5 minutes ago 352MB centos 7-ja-with-clean fa93ef373ec3 6 minutes ago 284MB参考
- Window10に日本語対応CentOS7のdockerコンテナを作ってみた
man
の日本語化についても解説されています。
- 投稿日:2020-09-26T17:08:07+09:00
Docker MongoDB mongo-express
MongoDB を Docker で使いたい
私はアプリを開発する際にデータベースをMac等のローカル環境にダウンロードしたくないので、Dockerというコンテナ管理ツールを使用しています。移行も楽なので。本番環境でも使いたいのは山々ですが、Kubernetes周りの知識がないので中々踏み込めないという感じです。まぁ規模にも因るんですが。
この記事はDockerを使ってMongoDBをたてるサンプルみたいなもの。他にわかりやすいものがなくて、作る際に調べた記憶があったので。
動作環境はMacOS Catalina
Goal
docker-compose.ymlファイルを作成してMongoDBとmongo-expressをlocalhostにたてます。
MongoDBというのはNoSQL
mongo-expressというのはMySQLでいうphpMyAdminみたいなもの。MongoDBの中身が見易くなる。docker-compose.yml
# Use root/example as user/password credentials version: "3.1" services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root # ユーザー名 MONGO_INITDB_ROOT_PASSWORD: tree # パスワード ports: - 27014:27017 volumes: - ./db:/data/db - ./configdb:/data/configdb mongo-express: image: mongo-express restart: always ports: - 8080:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root # ユーザー名 ME_CONFIG_MONGODB_ADMINPASSWORD: tree # パスワード解説
docker-compose.ymlファイルの基本的な書き方は以下参照。
https://docs.docker.com/compose/compose-file/portsの指定は以下参照
https://qiita.com/tksugimoto/items/23fcce1b067661e8aa46#%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9Cvolumesで指定した場所にデータベースのファイルが作成されます。
sample/docker-compose.yml にファイルがあったとするとsample/dbとsample/configdbが作成されます。How To Use
whoami$ pwd /Users/whoami/sample whoami$ ls docker-compose.yml whoami$ docker-compose up -d // -d は daemon で実行という意味 Creating network "sample_default" with the default driver Creating sample_mongo-express_1 ... done Creating sample_mongo_1 ... done whoami$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1aeb90deadd0 mongo "docker-entrypoint.s…" 23 seconds ago Up 22 seconds 0.0.0.0:27014->27017/tcp sample_mongo_1 6649bb697412 mongo-express "tini -- /docker-ent…" 23 seconds ago Up 9 seconds 0.0.0.0:8080->8081/tcp sample_mongo-express_1 whoami$ docker-compose down Stopping sample_mongo_1 ... done Stopping sample_mongo-express_1 ... done Removing sample_mongo_1 ... done Removing sample_mongo-express_1 ... done Removing network sample_default whoami$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdocker-compose up -dした後ブラウザで[http://localhost:8080/]を開くと、そこに**mongo-express**があります。
注意
ポート番号の指定を適当にやりすぎるとMongoDBがたたない。DockerのMongoDBのポートが27017しかないみたいな記事も見た事がある気がする。
mongo-expressはdockerでは開発環境しか使えないらしい。予告
これでたてたMongoDBにNode.jsから繋ぐ方法も書こうと思う。
公式ref