blog.kotamiyake.me

為せば成る、為さねば成らぬ何事も

個人のRailsプロジェクトでDockerを使って環境構築をしていた際にハマったお話。

原因

  • Rackのバージョンが上がって、ホストとポートを分割する挙動が変わりアンダースコアのホストがマッチしなくなった

Rackの挙動の変更点は以下の通り。

対策

  • docker-composeのサービス名をハイフンで繋ぐよう修正する

経緯

元々以下のような構成でdocker-composeを使って環境を構築していました。

アプリ本体とwebpack-dev-serverを動かすアプリを分離する構成です。

services:
  app:
    <<: *app
    command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
    environment:
      WEBPACKER_DEV_SERVER_HOST: webpack_dev_server
    ports:
      - 3000:3000
    depends_on:
      - db
  webpack_dev_server:
    <<: *app
    command: ["bin/webpack-dev-server"]
    environment:
      WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
    ports:
      - 3035:3035

それから開発中にRackのバージョンをアップデートしたところ、以下のエラーが吐き出されてjsが参照できなくなりました。

#<SocketError: Failed to open TCP connection to webpack_dev_server:3035:80 (getaddrinfo: Name or service not known)>

今回は開発環境での出来事だったので特に問題はなかったのですが、みなさんもgemのアップデートの際にはくれぐれもご注意を…。

docker imagesdocker images -a とすると、REPOSITRYが <none> で、尚且TAGも <none> と表示されるイメージが生成されることがあります。

どうやらこれには2種類のケースがあるようです。

  1. Dockerイメージの中間層に位置する部分として使われているイメージが <none> と表示される
  2. 同一のDockerfileを使用してTAGの異なるDockerイメージをビルドしようとすると古いイメージが <none> と表示される

よくググって <none> になっているイメージを消そう系は、すべて2.のケースが当てはまるのだと思います。これらのイメージを dangling images と言うらしいです。

そもそも1.のケースで生成された <none> のイメージは、以下のようなエラーメッセージが表示されて削除できないかと思います。

$ docker image rm f3097c2cbe74
Error response from daemon: conflict: unable to delete f3097c2cbe74 (cannot be forced) - image has dependent child images

また dangling images を消すために色々な記事で何やらややこしいコマンドを紹介されていますが、最近のバージョンでは docker image prune としてあげるだけでお掃除ができるようになっています。

Dockerについてはまだまだわからないことだらけなので、引き続き勉強していって学んだことを共有していきたいと思います。

参考記事

Dockerを使って好きなバージョンのMySQLで開発を進める方法を紹介したいと思います。

Dockerのインストール

DockerとDocker Composeをインストールして下さい。Macを利用している方は以下のリンクからインストールして下さい。

Docker For Mac | Docker

これでDockerとDocker Composeが利用できるようになります。

docker-compose.ymlの準備

次にdocker-compose.ymlを準備します。

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
      - ./docker/mysql:/etc/mysql/conf.d
    ports:
      - "3307:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: railsdevroot
      MYSQL_USER: railsdev
      MYSQL_PASSWORD: railsdev
volumes:
  db_data:

プロジェクトと紐づくようにRailsのルートフォルダにファイルを作成して下さい。

細かい設定の意味については下記のドキュメントを参考にして下さい。

Compose file version 3 reference | Docker Documentation

volumes:
  - db_data:/var/lib/mysql
  - ./docker/mysql:/etc/mysql/conf.d

MySQLは/etc/mysql/conf.dに*.cnfというファイルが存在するとそちらを設定ファイルとして読み込んでくれるので、個別に設定が必要な場合は独自にファイルを用意してvolumnsセクションでパスを設定します。

今回はDocker用の設定ファイルということで便宜上docker/mysql/というフォルダを作ってそこに設定ファイルを作り読み込むようにしています。

こちらは各プロジェクトに合わせてて適宜読み替えて下さい。

Rails側の設定

あとはRailsのdatabase.ymlで接続先を設定するだけです。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: sample_development
  port: 3307
  password: railsdevroot
  host: 127.0.0.1

気をつける箇所はhostを設定していないとホスト側のDBへ繋ごうとするので忘れずに指定する必要があります。

これで複数のプロジェクトで異なるバージョンのMySQLを使用していても、互いに影響することなく開発を進めることができます。

皆さんもぜひ試して下さい。

テーマ開発のためにdockerを使ってWordPressの環境をMacに構築しようと思います。

Dockerのホームページにガイドがあったので、そちらを参考にして進めていきたいと思います。

https://docs.docker.com/compose/wordpress/

下準備

まずはDocker for Macをインストールしましょう。

https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac

作業用のディレクトリを作成します。

mkdir wordpress_dev
cd wordpress_dev

それからdocker-compose.ymlを用意します。

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - ./themes/your_theme:/var/www/html/wp-content/themes/your_theme # 環境に合わせて変更
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
volumes:
  db_data:

それからWordPressのテーマを./themes/your_theme に用意します。

ビルド

docker-compose up -d

ローカルにイメージがない場合はダウンロードしてくるので少々待ちます。

doneになったらlocalhost:8000にアクセスします。



これで環境が整いました。

コンテナとネットワークの設定を削除するには以下のコマンドを実行します。

docker-compose down

テーマを増やしたい場合には、

volumes:
  - ./themes/your_theme:/var/www/html/wp-content/themes/your_theme
  - ./themes/your_theme2:/var/www/html/wp-content/themes/your_theme2

と言った感じに増やしていけばOKです。もちろんパス指定を置き換えるだけでも良いです。

まとめ

駆け足で説明しましたが、これでMacにWordPressのテーマを開発するための環境が整いました。このブログのテーマも刷新しようかと思っているので乞うご期待!