はじめに
限られた物理PC の中で各バージョンの Ruby プログラムを作成することになった.
ただし、これ以上 物理PC を汚染させるわけにもいかないので Docker を活用した.
(操作しやすいように docker-compose を導入した)
また、物理ホスト側からバッチを使って、極力コンテナに「手動で」ログインせずに
Ruby コードを実行するようにした.
今後もこの環境構築は頻発すると思うので書き残しておく.
今回は「ビルドコンテナ」を作成する場合についてである.
構築後のファイル構成
.
|-- PV ......................... 永続ボリューム
| `-- rb
| `-- app ................ この直下に *.rb を配置していく
| `-- Gemfile
|-- assets
| `-- rb
| `-- Dockerfile
`-- docker-compose.yml
手順
1. 永続ボリュームを作成する
コードやデータを配置するために使用する.
$ mkdir -p PV/rb/app
2. Dockerfile を作成する
独自拡張するために使用する.
$ mkdir -p assets/rb/
$ vim assets/rb/Dockerfile
assets/rb/Dockerfile
FROM ruby:3.0-slim-buster
## プロキシサーバを使う場合
# ENV http_proxy="http://proxy.co.jp:8080"
# ENV https_proxy="http://proxy.co.jp:8080"
# コンテナ内での作業場所を /usr/src/app とする
WORKDIR /usr/src/app
# Ruby に関する環境変数
# 日本環境に合わせる
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANGUAGE ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
3. Gemfile を作成する
ここでは PV/rb/app/Gemfile
に定義する
PV/rb/app/Gemfile
以下は例である.
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
# gem "rails"
gem 'faker', '1.7.2'
gem 'elasticsearch', '7.14.0'
gem 'elasticsearch-api', '7.14.0'
gem 'multi_json'
gem 'faraday'
gem 'activesupport'
gem 'minitest'
gem 'jbuilder'
gem 'hashie'
4. docker-compose.yml を作成する
docker-compose.yml
version: '3.7'
services:
rb:
build: ./assets/rb
image: myruby3.0
container_name: myruby3.0
tty: true
volumes:
- ./PV/rb/app/:/usr/src/app/
command: >
bash -c '
bundle install
while true; do sleep 3600; done
'
5. イメージビルドをする
次のコマンドによって、Dockerイメージ「myruby3.0
」が作られる
$ docker-compose build --no-cache
6. 常駐型コンテナを起動させる
次のコマンドによって、Dockerコンテナ「myruby3.0
」が作られる
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
----------------------------------
piyoruby3.0 bash -c Up
bundle install
7. 所望のバージョンであることを確認する
デフォルトで使用される Ruby が 3.0 であることを確認する.
$ docker-compose exec rb bash -c 'which ruby'
/usr/local/bin/ruby
$ docker-compose exec rb bash -c 'ruby --version'
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
8. サンプルコード a.rb を作成する
$ cat <<'EOL' | tee PV/rb/app/a.rb
#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-
p 'Hello Ruby'
EOL
$ chmod +x PV/rb/app/a.rb
9. 実行する
コンテナログイン時のパスは /usr/src/app
である. (∵ Dockerfile の WORKDIR のため)
$ docker-compose exec rb bash -c './a.rb'
"Hello Ruby"
補足
コンテナ内にログインするには
次を実行する
$ docker-compose exec rb bash
実行環境 (イメージとコンテナ) を一掃する
永続ボリューム (ここでは ./PV
) は残るので問題ない
$ docker-compose down --rmi all --volumes --remove-orphans