20200910のdockerに関する記事は11件です。

Dockerを使ったCICDパイプラインの構築(個人的備忘録)

Gitの設定

1.任意の名前でリポジトリの作成
2.publicの設定
3.「create repository」をクリック
4.ユーザー設定
-# アプリのディレクトリで行う
% git config user.name ”ユーザー名”
% git config user.email “githubの登録メール”
-# 設定したユーザー名、emailが登録されていることを確認する。
% git config user.name
% git config user.email
5.リモートリポジトリの紐付け
% git remote add origin リポジトリのURL.git
-# 紐付けの確認
% git remote -v

リポジトリにpushする

% git add .
% git commit -m ‘first commit’
% git push origin master

リポジトリにアプリがpushできているか確認する。

Travis CIに登録

1.右上のSign inをクリック
2.「SIGN IN WITH GITHUB」をクリック
3.「Authorize travis-ci」をクリック
4.Githubの情報を入力
5.左の「+」をクリックする
6.任意のリポジトリをクリックし同期させる
7.上部の「Dashbord」をクリックし、「Active repositories」に選んだリポジトリがあることを確認する。

.travis.ymlの作成

-# アプリのホームディレクトリに作成する
% vim .travis.yaml
.travis.yaml
# sudo権限で実行
sudo: required
# dockerの使用宣言
services: docker

# コンテナの起動
before_install:
  - docker-compose up --build -d

script:
  # DBの準備
  - docker-compose exec —env 'RAILS_ENV=test' web rails db:create
  - docker-compose exec —env 'RAILS_ENV=test' web rails db:migrate
  # テストの実行
  - docker-compose exec —env 'RAILS_ENV=test' web rails test

Travi CIを動かすにはgithubにコードをpushする必要がある。

docker-compose.ymlの記述
version: '3'
# dockervolumeここにデータが保存される
volumes: 
  db-data:

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/product-register'
# コンテナの環境変数設定、本来は直接パスワードを書いてはいけない。
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
# dbサービスが作られたら作成される
    depends_on:
      - db
# webからdbにアクセスできる
    links:
      - db
# postgresのコンテナ
  db:
    image: postgres
# ホストのdb-dataにデータを保管
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
# localhost以外でpostgresを動かす場合に必要
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

gitへpushする

% git add .
% git commit -m ‘update travis and compose’
% git push origin master

ここでtravisのページで実際に実行されている状況が確認できる。

Herokuの準備

1.ログインする
2.「create new app」をクリック
3.「APP name」に任意の名前をいれる。
4.「Create app」をクリック
5.作成されたら「Resources」をクリック。
6.「Add-ons」でpostgresで検索。「Heroku Postgres」を選択
7.「Provision」をクリック。
8.「Settings」をクリック、「Reveal Config Vars」をクリック。
9.config/master.keyの値をVALUEに入力する。
10.KEYの入力に「SECRET_KEY_BASE」と入力する。
11.「Add」をクリックする。
12.「Deploy」のタブをクリック。
13.「Deployment method」のGitHubをクリック
14.「Connect to GitHub」でリポジトリの名前を入力、「Search」をクリック
15.任意のリポジトリの「Connet」をクリック
16.「Automatic deploys」のWait for CI to pass before deploy(CIを通過してからデプロイ)にチェックする。
17.「Enable Automatic Deploy」をクリック

databese.ymlの最下部をこのように設定する

config/databese.yml
# You can use this database configuration with:
#
production:
  url: <%= ENV['DATABASE_URL'] %>
#
# production:
#   <<: *default
#   database: product-register_production
#   username: product-register
#   password: <%= ENV['PRODUCT-REGISTER_DATABASE_PASSWORD'] %>

.travis.ymlの修正

.travis.yml
# sudo権限で実行
sudo: required
# dockerの使用宣言
services: docker

# コンテナの起動
before_install:
  - docker-compose up --build -d
# HerokuのDockerレジストリにログイン
  - docker login -u "$HEROKU_USERNAME" -p "$HEROKU_API_KEY" registry.heroku.com

script:
  # DBの準備
  - docker-compose exec --env 'RAILS_ENV=test' web rails db:create
  - docker-compose exec --env 'RAILS_ENV=test' web rails db:migrate
  # テストの実行
  - docker-compose exec --env 'RAILS_ENV=test' web rails test

deploy:
  provider: script
  script:
    docker build -t registry.heroku.com/$HEROKU_API_NAME/web -f Dockerfile.prod .;
    docker push registry.heroku.com/$HEROKU_API_NAME/web;
    heroku run --app $HEROKU_API_NAME rails db:migrate;
  on:
    branch: master

コメントアウトを入れると不具合が見られるので極力入れない方が良し。

Travis CIに環境変数を設定する

-# Heroku-cliをインストール
% brew tap heroku/brew && brew install heroku
-# Tokenの取得
% heroku authorizations:create

1.Travis CIを開きリポジトリを開く。
2.「More options」の「Settings」をクリック
3.「Environment Variables」のNAMEに「HEROKU_USERNAME」、VALUEに「 _ 」を入力し、
「Add」をクリック。同じようにNAMEに「HEROKU_API_KEY」、VALUEには先ほどのTokenを入力、「Add」をクリック。また「HEROKU_API_NAME」にはherokuのリポジトリ名をいれる。

Herokuに環境変数を設定する

1.Herokuを開き、任意のアプリをクリック
2.「Settings」タブをクリックし、「Reveal Config Vars」をクリック。
3.docker-compose.ymlに設定している、dbサービスのenvironmentの”DATABASE_PASSWORD=postgres”をKEYにDATABASE_PASSWORD、VALUEにpostgresとし「Add」をクリック。

Dockerfile.prod(本番環境用)の作成

% vim Dockerfile.prod
Dockerfile.prod
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
# カレントディレクトリのコードを全てコンテナに移す
COPY . .
# railsサーバの起動
CMD [ "rails", "s"]
% git add .
% git commit -m ’add deploy code’
% git push origin master

実際の開発フロー

1.ブランチの作成 % git checkout -b hoge
2.作業を行う
3.変更したファイルをadd % git add .
4.変更をコミットする % git commit -m ’messege’
5.ブランチにpush % git push origin huge
(Travis CIが動く)
6.プルリクの作成
7.プルリクをmergeする(Travis CI完了後)
8.Travis CIが動く
9.Herokuにデプロイされる。

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

cygwin で docker のコンテナ内シェルを使う [docker exec -it bash]

cygwin で docker のコンテナ内シェルを使う

環境

  • windows10
  • cygwin
  • Docker Desktop CE for Windows

概要

そのままでは動かなかったので忘備録として残すことに。

  • 以下のように apt-cyg でエラーが出る場合は更新する
$ apt-cyg install gcc-g++
Cache directory is /packages
Mirror is http://mirrors.kernel.org/sourceware/cygwin
--2020-09-10 17:31:34--  https://cygwin.com/key/pubring.asc
cygwin.com (cygwin.com) をDNSに問いあわせています... 8.43.85.97
cygwin.com (cygwin.com)|8.43.85.97|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3049 (3.0K) [text/plain]
`/tmp/tmp.2B5Pa48nYk' に保存中

/tmp/tmp.2B5Pa48nYk                               100%[=============================================================================================================>]   2.98K  --.-KB/s 時間 0s

2020-09-10 17:31:35 (12.5 MB/s) - `/tmp/tmp.2B5Pa48nYk' へ保存完了 [3049/3049]

TRUSTEDKEY_CYGWIN: FAILED: Hash does not match https://cygwin.com/key/pubring.asc.
Error: TRUSTEDKEY_CYGWIN has been updated, maybe. But sometimes it may has been cracked. Be careful !!!
at : /usr/local/bin/apt-cyg: fetch_trustedkeys: 745

  • winpty が入っていない場合は winpty のインストールをする
$ docker exec -it busy_williamson bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

apt-cyg の更新

  • apt-cyg を download
$ cd /usr/local/bin
$ wget https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
--2020-09-10 17:39:36--  https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.108.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.108.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68542 (67K) [text/plain]
`apt-cyg.1' に保存中

apt-cyg.1                                         100%[=============================================================================================================>]  66.94K  --.-KB/s 時間 0.03s

2020-09-10 17:39:48 (2.40 MB/s) - `apt-cyg.1' へ保存完了 [68542/68542]
  • apt-cyg の入れ替え
rm apt-cyg
mv apt-cyg.1 apt-cyg
chmod +x apt-cyg

winpty のインストール

  • gcc-g++, mingw64-x86_64-gcc-g++ のインストール
$ apt-cyg install gcc-g++
$ apt-cyg install mingw64-x86_64-gcc-g++
  • winpty のインストール
$ mkdir winpty (ダウンロードするディレクトリ、適宜用意してください)
$ cd winpty

$ wget https://github.com/rprichard/winpty/archive/master.zip
$ unzip master.zip

$ cd winpty-master/
$ ./configure
$ make
$ make install

docker exec -it bash

  • コンテナコンソール利用
winpty docker exec -it busy_williamson bash

以上、お疲れさまでした!

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

ちいさなDockerコンテナ

ちいさなDockerイメージ・コンテナのメモ

scratchの中身

以下を試して、scratchの中身は全くの空っぽであることを確かめた。

$ uname -sm
Darwin x86_64
$ GOOS=linux GOARCH=arm64 go build -o hello hello.go
$ cat > Dockerfile
FROM scratch

COPY hello /hello
ENTRYPOINT ["/hello"]
^D
$ docker image build -t test/hello .

$ docker image ls
REPOSITORY TAG    IMAGE ID     CREATED     SIZE
test/hello latest b5590fa74374 2 hours ago 2.04MB

$ docker run test/hello
Hello, World

$ docker image save -o out.tar test/hello
$ ls -lhn out.tar
-rw-------  1 501  20   2.0M  9 10 18:12 out.tar

$ tar xvf out.tar 
x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/
x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/VERSION
x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/json
x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/layer.tar
x b5590fa74374835c813ed2c8490b2997581d3b815d306be739a2be67f6664792.json
x manifest.json
x repositories

$ tar tvf 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/layer.tar
-rwxr-xr-x  0 0      0     2038890  9 10 16:28 hello

tar ballからちいさなコンテナを作る

コンテナだからchroot環境をtarに固めてimportすれば動くだろう。

$ mkdir chroot
$ GOOS=linux GOARCH=arm64 go build -o chroot/hello hello.go
$ ls -lRhn chroot
total 4104
-rwxr-xr-x  1 501  20   2.0M  9 10 18:21 hello

$ (cd chroot; tar cf ../image.tar .)
$ ls -lhn image.tar 
-rw-r--r--  1 501  20   2.0M  9 10 18:24 image.tar

$ docker image import image.tar test/import

$ docker image ls test/import
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/import         latest              bb6be6e60bb1        19 seconds ago      2.1MB

$ docker run test/import /hello
Hello, World

うまく動いた

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

Ruby on Rails × DockerでRspecを導入

目標

  • rails × docker 環境でrspecを導入したい

前提

  • Docker on mac
  • Ruby on Rails

手順

1.Gemfileにgemを追加する

以下のgemを:develop, :testに追加する
gem "rspec-rails"
gem "factory_bot_rails"

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  # テストフレームワーク
  gem "rspec-rails"
  gem "factory_bot_rails"
end

2.サーバーとは別のターミナルからrspecをインストールする

MacBook-Air アプリ名 % docker-compose run web rails g rspec:install
Starting アプリ名_db_1 ... done
Running via Spring preloader in process 64
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

これで設定ファイルがディレクトリに作られる

さっそくテストを作成してみる

modelのspecを追加してみる

まずディレクトリを生成する。modelは自身がすでに生成したmodel.

MacBook-Air アプリ名 % docker-compose run web rails g rspec:model reception
Starting アプリ名_db_1 ... done
Running via Spring preloader in process 64
      create  spec/models/reception_spec.rb
      invoke  factory_bot
      create    spec/factories/receptions.rb

生成できたら今回はバリデーションに関するテストを書く

spec/factories/reception.rb
FactoryBot.define do
  factory :reception do
    name {"サンプル訪問者1"}
    purpose {"面談"}
    organization {"サンプル株式会社"}
  end
end
spec/models/reception_spec.rb
RSpec.describe Reception, type: :model do
  reception = FactoryBot.create(:reception)

  it 'receptionインスタンスが有効' do
    expect(reception).to be_valid
  end
end

specを追記したら、

MacBook-Air アプリ名 % docker-compose run web bundle exec rspec

で実行完了

MacBook-Air アプリ名 % docker-compose run web bundle exec rspec
Starting アプリ名_db_1 ... done
.

Finished in 0.22889 seconds (files took 6.32 seconds to load)
1 example, 0 failures

参考文献

https://qiita.com/Ushinji/items/522ed01c9c14b680222c

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

WSL2上のDockerでMySQLを構築する際のpermissionsの対策

前書き

WSL2 MySQLで検索してもなかなかpermissionの解決方法が見つからずにハマった人の為に記載する。(どいつもこいつもWindowsのDockerとリンクしやがって・・・GPU使わんのかい!)

環境

  • Windows10 Insider Preview 2004(20206.1000)
  • 4.19.128-microsoft-standard
  • Ubuntu 20.04 LTS

現象

docker-compose up -dでコンテナ起動をさせると以下のような感じでMySQLのコンテナが起動できない。

root@pc-name: docker-compose logs mysql
mysql_1   | mysqld: Cannot change permissions of the file 'private_key.pem' (OS errno 1 - Operation not permitted)
mysql_1   | 2020-09-10T05:04:53.449233Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for private_key.pem
mysql_1   | 2020-09-10T05:04:53.449629Z 0 [ERROR] [MY-010119] [Server] Aborting

こいつ(permission)の対応策について記載したい

対応

/etc/wsl.confにマウントオプションを追加する。

追加するマウントオプション
[automount]
options = "metadata"

WSL2初めの方は基本存在しないと思うので以下の手順で対応する。
WSL2のディストリビューションに/etc/wsl.confを作成。

# ルートでログイン
user@pc-name:sudo -i
# wslのディストリビューションにwslの設定ファイルを新規作成
root@pc-name: sudo touch /etc/wsl.conf
# 設定ファイルを編集する。
root@pc-name: vi /etc/wsl.conf

マウントオプションを変更する。 iでviコマンドをinsertモードにして以下を入力。

[automount]
options = "metadata"

ESCを押下後、上書き保存(:wq)し、WSLを再起動。

# ルートログアウト
root@pc-name:exti
# wsl ログアウト
user@pc-name:exit
# WSL シャットダウン
wsl --shutdown
# WSLを起動+ログイン
wsl

これで再度Docker関係でPermissionのエラーが消えていると思います。

おまけ

以下のようなログは/var/lib/mysqlのマウントディレクトリが既に存在する為
そのディレクトリを削除することで解決する。

root@pc-name: docker-compose logs mysql
...
mysql_1   | 2020-09-10T05:00:42.590708Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
mysql_1   | 2020-09-10T05:00:42.590714Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
mysql_1   | 2020-09-10T05:00:42.590777Z 0 [ERROR] [MY-010119] [Server] Aborting
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】【Docker】コピペでOK! DockerでRails開発環境を構築する方法

【Rails】【Docker】コピペでOK! DockerでRails開発環境を構築する方法

目次


構築イメージ

今回は3つのコンテナを作成します.

image.png

動作環境・前提条件

【動作環境】
OS : macOS 10.14.6
Docker : 19.03.8
ruby : 2.6.5
rails : 5.2.4

【前提条件】
Docker for Macをインストール済み

STEP1. Dockerfileを作成する

まずはDockerフォルダと空ファイルを作成します.
ファイルの内容は後述します.

image.png

STEP1-1. nginxのDockerfile

以下がnginxのdockerfileになります.
findpro-bangkokはアプリ名なので各自のアプリ名に変更してください.

Dockerfile
FROM nginx:1.15.8

# インクルード用のディレクトリ内を削除
RUN rm -f /etc/nginx/conf.d/*

# Nginxの設定ファイルをコンテナにコピー
COPY /docker/nginx/nginx.conf /etc/nginx/conf.d/findpro-bangkok.conf

# 画像などのpublicファイルはnginxに配置
RUN mkdir -p /findpro-bangkok/public
COPY ./public /findpro-bangkok/public

# ビルド完了後にNginxを起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

STEP1-2. nginxの設定ファイル

nginxの設定を記述するnginx.confを作成します.

nginx.conf
# プロキシ先の指定
# Nginxが受け取ったリクエストをバックエンドのpumaに送信
upstream puma {
  # ソケット通信したいのでpuma.sockを指定
  server unix:///findpro-bangkok/tmp/sockets/puma.sock;
}

server {
  listen 80 default;
  # ドメインもしくはIPを指定
  server_name localhost;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  # ドキュメントルートの指定
  root /findpro-bangkok/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @puma;
  keepalive_timeout 5;

  # リバースプロキシ関連の設定
  location @puma {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://puma;
  }
}

STEP1-3. railsのDockerfile

次にrailsのDockerfileを作成します.

Dockerfile
FROM ruby:2.6.5

RUN apt-get update -qq && \
  apt-get install -y apt-utils \
  build-essential \
  libpq-dev \
  nodejs \
  vim

#各自のアプリ名に変更する
ENV RAILS_ROOT /findpro-bangkok

RUN mkdir $RAILS_ROOT
WORKDIR $RAILS_ROOT

COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN gem install bundler:2.1.4
RUN bundle install

#プロジェクトフォルダ内のすべてのファイルをRailsコンテナ内にコピーする
COPY . .

#ソケット通信のためのディレクトリを作成
RUN mkdir -p tmp/sockets

STEP2. pumaの設定

以下のconfigフォルダ内のpumaの設定ファイルを編集します.
*pumaフォルダは本番用のフォルダのため今回は青のpuma.rbを編集します.

image.png

puma.rb
threads_count = ENV.fetch('RAILS_MAX_THREADS') { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch('PORT') { 3000 }
environment ENV.fetch('RAILS_ENV') { 'development' }
plugin :tmp_restart

app_root = File.expand_path('..', __dir__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

STEP3. docker-composeの作成

docker-composeは複数のコンテナのビルドをまとめて実行してくれる仕組みになります.

docker-composeファイルをプロジェクトフォルダ直下に作成します.

image.png

docker-compose.yml
version: '3'
volumes:
  tmp_data:
  public_data:
services:
  nginx:
    build:
      context: ./
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - '80:80'
    volumes:
      - public_data:/findpro-bangkok/public
      - tmp_data:/findpro-bangkok/tmp/sockets
    depends_on:
      - app
    links:
      - app
  app:
    build:
      context: ./
      dockerfile: ./docker/rails/Dockerfile
    command: bundle exec puma
    volumes:
     #.:/findpro-bangkokでプロジェクトのカレントフォルダとコンテナのフォルダを同期しています.これによって変更した箇所を再度ビルドすることなく、コンテナに反映することができます.
      - .:/findpro-bangkok:cached
      #nginxとsocket通信するためにホストコンピュータ上にtmp_dataというファイルを作成し、nginxコンテナと共有しています.
      - tmp_data:/findpro-bangkok/tmp/sockets
      - public_data:/findpro-bangkok/public
    tty: true
    stdin_open: true
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: 'postgres'

STEP4. データベースの設定

最後にdatabase.ymlでデータベースの設定をします.
今回はdevelopement環境のため、developmentまでの設定内容を記載します.

image.png

*testやproductionの記述が下のほうにあるので、そちらは消さずにそのままにしておきます.

# PostgreSQL. Versions 9.1 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On OS X with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  port: 5432
  username: postgres
  password: postgres
  pool: 5

  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: findpro-bangkok_development

###以下省略

STEP5. コンテナのビルド

それではいよいよ作成したコンテナを起動します.

まずはターミナルでプロジェクトフォルダに移動し、以下のコマンドを実行します.

[JS-MAC findpro-bangkok]$ docker-compose build

ビルドが成功したあとに以下のコマンドを実行します.

[JS-MAC findpro-bangkok]$ docker-compose up

STEP6. データベースの作成

最後にデータベースを作成する必要があるので
もう一つ新規にターミナルを起動し、Railsコンテナに入ります。

[@JS-MAC findpro-bangkok]$ docker ps #Railsコンテナ(findpro-bangkok_app)のIDを確認
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                NAMES
4549423f21ed        findpro-bangkok_nginx   "/bin/sh -c '/usr/sb…"   44 minutes ago      Up 3 seconds        0.0.0.0:80->80/tcp   findpro-bangkok_nginx_1
22ecc47308ae        findpro-bangkok_app     "bundle exec puma"       44 minutes ago      Up 5 seconds                             findpro-bangkok_app_1
755cb83a9bf4        postgres                "docker-entrypoint.s…"   44 minutes ago      Up 5 seconds        5432/tcp             findpro-bangkok_db_1
[@JS-MAC findpro-bangkok]$ docker exec -it 22e /bin/sh #Railsコンテナにログインする.22eはappコンテナのIDの頭文字です.
# rails db:create #データベースを作成する.
Database 'findpro-bangkok_development' already exists
Database 'findpro-bangkok_test' already exists
# rails db:migrate #マイグレーションを実行する.

STEP7. 確認

最後にchromeでlocalhostと打ち確認します.

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

dockerのphp-apacheイメージでのapache再起動

やりたこと

dockerのphp-apacheイメージで不意にapacheが停止した場合、apacheを起動したい。

環境

  • dockerimage php:7.4-apache

コマンド

service apache2 start

以下はダメ。

service httpd start
httpd: unrecognized service
/etc/init.d/httpd start
bash: /etc/init.d/httpd: No such file or directory
apachectl start
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.2. Set the 'ServerName' directive globally to suppress this message

php:7.4-apacheがDebianだからとかなのかhttpdが使えなくて困った。

cat /etc/issue
Debian GNU/Linux 10 \n \l
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

同僚の作成したdockerコンテナをbuildする際にコケたポイントメモ

初めに

同僚が作成してくれたnodeのdockerコンテナをbuildする際に何点かコケたポイントがありましたのでメモしてみます。
同様のケースで嵌っている方がいたら参考になれたらと思います!

前提

コンテナを作成してくれた人のPC
Mac Pro
こちらの環境では一発docker-compose up --buildを流せばbuildとupが通る
私のPC
Windows10 Pro
npm --version
6.14.5
数回コケる
コンテナの構成
Node→image: node:latest
MySQL→image: mysql:5.7
Nginx→image: nginx:latest

Cannot create container for service mysql: Conflict

image.png

既にmysqlという名のコンテナが存在するからコンフリクトするぞというエラーですね。
他のnodeやnginxも同様に発生しました。
良くデフォルトの名前でコンテナ名をつける事が多いので、プロジェクト毎にコンテナ名をAservice_mysqlとかユニークな名前を指定するとスムーズかも知れませんね。
既に存在したmysqlコンテナはもう殆ど動かないプロジェクトのものでしたので、

docker rm コンテナID

削除しました。

npm ERR! enoent ENOENT: no such file or directory, rename '/src/node_modules/constantinople' -> '/src/node_modules/.constantinople.DELETE'

constantinopleが見つからないと怒られました。
constantinopleは定数の評価で使用するモジュールのようですね。
https://www.npmjs.com/package/constantinople
使用しているnpmのバージョンを最新にアップデートし解決しました。
6.14.5→6.14.8

npm install -g npm

仮にこの方法で直らなかった場合、単にnpm install時にmoduleの中身が破損しているパターンや、package-lock.jsonが各モジュールを良くない組み合わせのバージョンで固定しているパターンが考えられるので、
node_modulesの中身をすべて削除する
package-lock.jsonを削除して再度npm installする
を試してみてください。

npm ERR! Maximum call stack size exceeded

Nodeの最大コールスタックサイズを超えると発生するようです。
何でMacで起きないのにWindowsでは起きるんだ・・・。
npmのキャッシュを削除して再度buildしたら問題なく起動することができました。

npm cache clean --force

参考:https://www.it-swarm.dev/ja/javascript/npm%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E6%9C%80%E5%A4%A7%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%B6%85%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/829336672/
ちなみにnodeのstackサイズを変更すれば暫定的にこのコールスタックサイズ問題は解決しますが、
Nodeのパフォーマンスが悪くなる、最悪動かなくなる恐れがあるので止めた方が無難みたいです。。

最後に

同じ開発環境を瞬時に構築できるdockerは開発シーンに必須といえるツールになっていますね!
異なるOSでも動くのは素敵です。

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

Oracle 11g XE のdocker環境を作成する

概要

手順は以下の通り。

  • コンテナイメージを作成
    • Windows/Linux版に対応
  • docker-compose等で適度にセットアップ

対象

  • docker上でデータを含めたoracleインスタンスを立ち上げたい人

免責

本ドキュメントに記載しているコード等は他参考資料由来のもの1を除き、WTFPL2ライセンス2とし、いかなる保証もありません。
なお、エラーハンドリングは緩いので、改善願います。

準備

任意フォルダ(tools)に oracle-xe-11.2.0-1.0.x86_64.rpm.zip(Oracle Database 11g Release 2 Express Edition for Linux x64) をダウンロードしておく。
任意フォルダ(tools)に次のバッチを配置する。
※インターネットへの接続が必要

get_oracle.bat(Windows用)
set WORKING_DIR=%TMP%\oracle_build_wk
set CURRENT_DIR=%CD%
echo %WORKING_DIR%
mkdir %WORKING_DIR%
copy oracle-xe-11.2.0-1.0.x86_64.rpm.zip %WORKING_DIR%\
cd %WORKING_DIR%
curl --output Dockerfile.xe    -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/Dockerfile.xe
curl --output checkDBStatus.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/checkDBStatus.sh
curl --output runOracle.sh     -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/runOracle.sh
curl --output setPassword.sh   -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/setPassword.sh
curl --output xe.rsp           -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/xe.rsp

docker build %WORKING_DIR% --force-rm=true --no-cache=true --shm-size=1G --build-arg DB_EDITION=xe -t oracle/database:11.2.0.2-xe -f Dockerfile.xe > %CURRENT_DIR%\oracle11g_build.log 2>&1
cd %CURRENT_DIR%
del /Q /S %WORKING_DIR%
echo DONE

get_oracle.sh(Linux用)
#!/bin/sh

WORKDIR=/tmp/oracle11
CURRENTDIR=$(pwd)
mkdir $WORKDIR
cp oracle-xe-11.2.0-1.0.x86_64.rpm.zip $WORKDIR/
cd $WORKDIR
curl --output Dockerfile.xe    -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/Dockerfile.xe
curl --output checkDBStatus.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/checkDBStatus.sh
curl --output runOracle.sh     -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/runOracle.sh
curl --output setPassword.sh   -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/setPassword.sh
curl --output xe.rsp           -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/xe.rsp

DOCKEROPS=""
VERSION=11.2.0.2
EDITION="xe"
DOCKERFILE="Dockerfile"
DOCKEROPS="--shm-size=1G $DOCKEROPS";
IMAGE_NAME="oracle/database:$VERSION-$EDITION"
DOCKERFILE="$DOCKERFILE.$EDITION"
docker build ./ --force-rm=true --no-cache=true \
       $DOCKEROPS --build-arg DB_EDITION=$EDITION \
       -t $IMAGE_NAME -f $DOCKERFILE
cd $CURRENTDIR
rm -rf $WORKDIR
echo DONE

実行

get_oracle.bat または get_oracle.sh を実行する。
※必要に応じて実行権限を付与してください。(chmod +x get_oracle.sh)
エラーなく進めば、oracle/database:11.2.0.2-xe ができます。

docker-compose

そのままだと、何らおいしくないので、レシピを載せておく。(永続化しないので、コンテナを作り直したらデータはリセットされます)

docker-compose.yml
version: '3'

services:
  ## 必要に応じてその他サービスを記述
  oracledb_test:
    image: oracle/database:11.2.0.2-xe
    ports:
      - "1521:1521"
      #- "8080:8080"
    volumes:
      # ここのスクリプトがdba権限で動く。sqlplusやimp等を使いたい場合は、shファイルを配置しておくこと
      # なお、読み取り専用なので、ログファイルの出力を行う場合は、注意すること
      - ./oracledb/setup:/u01/app/oracle/scripts/setup:ro
      # 後からコンテ
      - ./oracledb/mnt:/mnt/local
    shm_size: 1g
    environment:
      - NLS_LANG=Japanese_Japan.UTF8
      - TZ=Asia/Tokyo
oracledb\setup\00_user_create.sql(UTF-8)
--勝手にパスワードを振られるので、変更する(絶対違うパスワードを指定してください)
ALTER USER sys IDENTIFIED BY manager;
ALTER USER system IDENTIFIED BY manager;

-- ユーザー作成
CREATE USER test_user IDENTIFIED BY test_user DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON users;
-- ロール作成
create role conn_testuser;
GRANT CREATE session, CREATE sequence, CREATE trigger, CREATE table, CREATE view, CREATE procedure, CREATE synonym TO conn_scn;
-- 権限付与
GRANT conn_testuser TO test_user;
--勝手に閉じてくれるので、exit等は不要

sqlでデータを投入する場合は、次のようなファイルを作成していく。

oracledb\setup\01_ddl.sql(UTF-8)
--スキーマを切り替え
ALTER SESSION SET CURRENT_SCHEMA = test_user;

--テーブル作成等

--勝手に閉じてくれるので、exit等は不要

おまけ: vagrant

Vagrant上でOracleインスタンスも立てちゃう場合は、次のように記載することでイメージの作成までやれる。
仮想マシンのインスタンスメモリは必ず2G以上にすること。(さもなくば、oracleを起動できません)

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # 中略
  #if Vagrant.has_plugin?("vagrant-cachier")
  #  config.cache.scope = :box 
  #end

  # 中略
  config.vm.provision "docker", run: "always"
  # ここから
  # Setup docker image for oracle 11g XE environment
    config.vm.synced_folder "./tools", "/tmp/tools", create: true
    config.vm.provision "shell", inline: <<-SHELL
      cd /tmp/tools
      /bin/sh ./get_oracle.sh
    SHELL
  # ここまで

  config.vm.provision "docker_compose",
                      compose_version: "1.24.1",
                      yml: "/vagrant/docker/docker-compose.yml",
                      run: "always"

end

参考文献


  1. 参考資料由来のものはvagrant関連コードとdocker build関連 

  2. Wikipediaより:どうとでも勝手にしやがれクソッタレ・公衆利用許諾(契約)書 

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

rails チュートリアル

1.3.4からスタート

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

docker image 作成時に Jupyter Lab のカスタム設定をする

これまでデータ分析の環境構築の際は、Anacondaで仮想環境を構築してpip installとかをしていた。ただこの場合、メモを残しておいたりしない限りは同じ環境を構築できなかったりするので、最近はDockerを使用するようになってきた。

基本的には、Jupyter公式のDocker Hubからdocker imageをpullし、必要なものを足していくという感じで環境構築している。(同じように環境構築している人が多い?)
ここで、環境構築時にJupyter Labのショートカットキーの作成も一緒にしてくれると嬉しいと思ったので、そのためのDockerfileの書き方を紹介する。
まだまだDockerについての理解が浅いので間違っていたりしたら指摘してくださるとありがたい。

また、簡単なデモが出来るようにGitHubにDockerfileなどをあげておいた。dockerを使用したことがある人なら、Dockerfileを読めばすぐに分かるはず。

設定方法

まず試したこと

単純にjupyterから引っ張ってきたimageからコンテナを作成すると、~/.jupyter/lab/の下にはworkspaces/があるだけ。

そこで、コンテナ上でJupyter LabのGUIからSettings -> Advanced Settings Editor -> Notebook -> User Preferencesに設定を記述すると、~/.jupyter/lab/user-settings/@jupyterlab/以下に新しくディレクトリとファイルができていることが確認できる。
つまりやることは、docker imageを作成するときに、新しく同じようなディレクトリを作成し、設定ファイルをそのディレクトリに置くだけ。

Dockerfile

Dockerfileは以下のように書くことができる。
Dockerfileと同じディレクトリ内に設定用ファイルを置いておけば、それをCOPYするだけで済む。

Dockerfile
# pull docker image
FROM jupyter/datascience-notebook

# make directory
RUN mkdir -p .jupyter/lab/user-settings/@jupyterlab/notebook-extension/ \
    && mkdir -p .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/

# copy setting files
COPY tracker.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/notebook-extension/
COPY shortcuts.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/

...

このDockerfileからdocker imageをビルドしてcontainerを作成すると、既にカスタム設定が適用されたJupyter Labを確認できる。

設定ファイルについて

tracker.jupyterlab-settingはNotebookの行数を表示する設定で以下のような内容。

tracker.jupyterlab-setting
{
    "codeCellConfig":{
        "lineNumbers": true,
    },
}

shortcuts.jupyterlab-settingsは、セルを上下させるショートカットキーの設定をしている。ショートカットキーの設定についてはこちらを参考に。

shortcuts.jupyterlab-settings
{
    "shortcuts": [
        {
            "command": "notebook:move-cell-up",
            "keys": [
                "Ctrl Shift K"
            ],
            "selector": ".jp-Notebook:focus"

        },
        {
            "command": "notebook:move-cell-down",
            "keys": [
                "Ctrl Shift J"
            ],
            "selector": ".jp-Notebook:focus"

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