しかしブラウザは、その app を Docker 内部の名前としてではなく、通常のホスト名として扱います。
app や dev は実在の TLD であり、しかも HSTS(HTTP Strict Transport Security)を強制する対象なので、ブラウザは http://app/ を https://app/ に書き換えます。
接続先が HTTPS 非対応なら、結果として ERR_SSL_PROTOCOL_ERROR や Are you trying to open an SSL connection to a non-SSL Puma? のようなエラーになります。
2026-03-25 05:37:53 +0000 HTTP parse error, malformed request: #<Puma::HttpParserError: Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?>
[Screenshot Image]: /x/tmp/screenshots/failures_test_should_destroy_Article.png
E
Error:
ArticlesTest#test_should_destroy_Article:
Selenium::WebDriver::Error::UnknownError: unknown error: net::ERR_SSL_PROTOCOL_ERROR
(Session info: chrome=145.0.7632.109)
test/system/articles_test.rb:38:in 'block in <class:ArticlesTest>'
Docker Composeのサービス名にappやdevを使うとSeleniumのHTTP接続がSSLエラーになる原因と対策
要点
Docker Compose の
compose.yamlでサービス名を付ける際は、HTTP での接続先となるコンテナのサービス名にはappやdevといったトップレベルドメイン(TLD)として実在する文字列を使わないほうが安全です。具体的な対策
HTTP で接続するサービス(コンテナ)には、ハイフン(
-)を用いて複数の単語を組み合わせた名前をつけるのが、簡単な解決策です。app,devrails-app,web-serverなぜエラーになるのか
Docker Compose のネットワーク内では、サービス名で名前解決をして他コンテナへアクセスできます。そのため、Selenium コンテナ内のブラウザから
http://app/のようにアクセスする設定にすることがあります。しかしブラウザは、その
appを Docker 内部の名前としてではなく、通常のホスト名として扱います。appやdevは実在の TLD であり、しかも HSTS(HTTP Strict Transport Security)を強制する対象なので、ブラウザはhttp://app/をhttps://app/に書き換えます。 接続先が HTTPS 非対応なら、結果としてERR_SSL_PROTOCOL_ERRORやAre you trying to open an SSL connection to a non-SSL Puma?のようなエラーになります。一方、
rails-appのように、TLD と一致しない名前にすれば、HSTS 強制の対象から外れ、HTTPS に書き換えられないため、エラーを防ぐことができます。背景:何が起きているか
Docker の
compose.yamlのservicesで定義したサービス名は、Docker ネットワーク内で他コンテナへアクセスする際のホスト名として使えます。ここでのホスト名とは、http://example.com/のexample.comに当たります。サービス名にドット(
.)が含まれていない場合、単一ラベルのホスト名となり、ブラウザはその名前を TLD として扱います。例えば、appというサービス名は、appという TLD のみからなるホスト名として認識されます。TLD のみのホスト名のうち、
appやdevは HSTS 強制の対象となっており、HSTS プレロードリストなどの仕組みにより、HTTPS 接続が強制されます。そのため、http://app/という HTTP での接続になるよう設定しても、ブラウザは強制的にhttps://app/という HTTPS での接続へと書き換えて接続しようとします。結果、
appやdevのような HSTS が強制される名前を持つサービス(コンテナ)に対して、Selenium コンテナ内のブラウザは、HTTP で接続するよう設定されていても、HTTPS で接続してしまいます。 さらに、接続される側のコンテナが HTTPS に対応していない場合、接続がエラーとなります。このように、E2E テストやシステムテストでは「ブラウザがどう解釈するか」は無視できない事項です。 コンテナ間疎通の都合だけで名前を決めるのではなく、ブラウザが特殊な扱いをする名前ではないか、という観点も持っておくとトラブルを減らせます。
注意点
http://app:3000/のような URL でもエラーになり得ます。facebook.comやwww.amazon.comといったドットを含むホスト名も多数存在するためです。接続エラーに遭遇した状況
compose.yamlにおいて、selenium/standalone-chromiumイメージの Selenium コンテナからサービス名がappのコンテナへ HTTP で接続する設定をしたところ、以下のエラーが発生しました。なお、サービス名を
appからrails-appに変更したところ、無事意図したとおりに動くようになりました。 HSTS 強制の対象となる TLD(app)との一致を回避した結果、ブラウザが HTTPS へ強制的に書き換えなくなったためと考えられます。参考資料
PmRails v1.1.0 をリリースしました。
リリースの概要
pmrails-new-plus: アプリの作成・gem のインストール・.gitignore の更新を1ステップで自動化します。.pmrails/var/: gem・キャッシュ・設定ファイルなどをプロジェクトごとに隔離して管理するようになりました。--userns=keep-idオプションを追加しました。リリースノートと変更履歴はGitHubで確認できます: https://github.com/wakairo/pmrails/releases/tag/v1.1.0
vscodeのdevcontainerでCodexを使うのを今は見送りにした理由
Codex(OpenAIのコーディング・エージェント)をdevcontainer(開発用コンテナ)の中に閉じ込めて動かすのは、 セキュリティの確保もできて、なかなか良いアイデアなのではと思いました。 ところが、vscodeで実際に試してみたところ、Codexのセキュリティの仕組みと絡んで、不都合な挙動があったので、 このやり方は公式にサポートされるまでは様子見が良いかなと今は思っています。
確認したこと
まずvscodeでdevcontainerを起動しました。 設定ファイル
.devcontainer/devcontainer.jsonの中身は以下の通りです。次に、Codex拡張をインストールしました。 その次に、Codexにソースファイルの一部を変更する指示を出したところ、
apply_patchが上手くいかないのでsedなどを代わりに使うという返答で、 変更前後のdiffが見づらい形になりました。なお、devcontainerの設定で指定するimageは以下の2つも試しましたが、 同じ現象に遭遇しましたので、特定のイメージでのみ発生する現象ではありません。
apply_patchが失敗する背景Codexが言うには、
apply_patchはbwrapという一種のコンテナの中で動かす仕組みらしく、 devcontainerというコンテナの中でbwrapというコンテナを動かす、 つまり、コンテナの中でコンテナを動かすのに失敗しているらしいです。 具体的には、devcontainerの中でbwrapのコンテナのために新しいnamespaceを作ろうとして、 permissionの問題に遭遇しているとのこと。Codexがbwrapを使うのはセキュリティを高めるためだと思いますので、 安易な設定変更などで
apply_patchを出来るようにするのは、 セキュリティ上のリスクがあると見ています。シェルスクリプトで壊さずに全ての引数を別コマンドに引き渡す書き方
基本はダブルクォーテーション付きの
"$@"シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は
"$@"を使います。 例えば、以下のように記述します。"$*"や$@(ダブルクォーテーションなし)を使うと、'foo bar'のようなスペースを含む引数がスペースで分割されて壊れてしまいます。shコマンドに渡すときは
sh -c '..."$@"...' -- "$@"1つの実行コマンドしか受け付けない
sudoやssh、docker runなどで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのがsh -c '...'です。シェルスクリプト内で
sh -c '...'にすべての引数を渡したいときは、sh -c '..."$@"...' -- "$@"と記述します。 例えば、以下のように記述します。先頭のいくつかの引数を取り出して残りを渡す場合(おまけ)
検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめて
sudoやssh、docker runなどに投げたい場合は、-cオプションの文字列内でshiftを使います。以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。
setup-rubyにおける.ruby-versionを用いたバージョン指定
ruby-version:が無いときのデフォルト動作では、まず.ruby-versionを読みに行くのですね。知りませんでした。ちなみに少し調べてみたら、2020年のv1.3.0のときから既にそういう仕様のようですね。
それから、railsの新規アプリのGitHub Actionsの設定も現在は
ruby-version:を省略するようになっていますね。setup-rubyにおける.ruby-versionを用いたバージョン指定
setup-rubyのREADMEに以下の記述がありますので、
ruby-version:を設定ファイルにあえて書かないことで、.ruby-versionに設定することも可能です。設定ファイルをできるだけ簡潔にしたいなら書かない選択もありですし、逆に分かりやすさを重視するなら明示的に書くのも一案です。どちらを取るかは悩ましいところですね。
Podmanのreplaceオプションを使ってワンコマンドでPodを作り直す
以下のコマンドの実行などで、Podに対応するKubernetes YAMLファイルを一度用意しておけば、
replaceオプションを利用した以下のコマンドで1つで、PodとそのContainerの停止から削除、再生成までを一度に行えます。Imageの更新について
Kubernetes YAMLファイル内で
imagePullPolicy:を指定していないlatestタグのImageは、replaceを利用した前述のコマンドの実行により、Imageの更新(pull)も併せて行われます。latest以外のタグのImageが更新された形でPodを再生成したい場合は、 以下のコマンドでImageを更新してから、
replaceを利用した前述のコマンドを実行します。参考情報
PmRails 1.0をリリースしました。
PmRails 1.0.0をリリースしました。
PmRailsは、Ruby on Railsのアプリケーションのテストまたは開発をするためのツールセットです。 RailsやRailsが依存するものをローカル環境にインストールすることなく使用できます。 Podmanを活用し、Railsプロジェクトのための隔離されたコンテナ環境を作成します。
ご不明な点や質問などございましたら、このTopicにお気軽にお寄せ下さい。できる範囲で回答いたします。
BlueStacks 5でアプリがシャットダウンを繰り返す問題の解決策
BlueStacks 5を立ち上げてしばらく経つと動かしていたアプリが勝手にシャットダウンする現象に遭遇し困っていた。 ネットで少し調べてみて、「Google Playストア」アプリの「ストレージを消去」したところ、この現象が起きなくなった。 ちなみに、ストアアプリやシャットダウンしていた方のアプリでキャッシュ削除をしたりもしたので、 このキャッシュ削除の方が有効打になった可能性もある。以上ご参考まで。
バージョン
BlueStacks App Player 5.21.600.1019 P64
参考
https://www.reddit.com/r/BlueStacks/comments/1h6lqje/bluestacks_app_interface_freezing_and_google/
setup-rubyにおける.ruby-versionを用いたバージョン指定
GitHub Actionsの設定ファイルでsetup-rubyを使う時に、 以下のように
ruby-versionのところで.ruby-versionと指定すると、 GitHubレポジトリからチェックアウトされたプロジェクトの中にある .ruby-versionという名前のファイルで指定されているrubyのバージョンが GitHub Actionsのsetup-rubyで使われます。jobsが複数あって、同じバージョンで複数回setup-rubyをしているときなどには、バージョン記述の重複がなくなって有用だと思います。
(参考)
この指定方法は、railsの新規アプリのGitHub Actionsの設定で利用されています。