ネットにアクセスするrubyコードnet.rb
:
require 'net/http'
Net::HTTP.get_print 'example.com', '/'
これをコンテナ内で実行する。
$ docker run --rm -ti -w /tmp -v /Users/komagata/dev/src/github.com/fjordllc/drill-sergeant/tmp:/tmp/program ruby ruby /tmp/program/net.rb
<!doctype html>
<html>
<head>
<title>Example Domain</title>
(略)
ネットをnoneにして実行する。
$ docker run --net=none --rm -ti -w /tmp -v /Users/komagata/dev/src/github.com/fjordllc/drill-sergeant/tmp:/tmp/program ruby ruby /tmp/program/net.rb
/usr/local/lib/ruby/3.0.0/net/http.rb:987:in `initialize': Failed to open TCP connection to example.com:80 (getaddrinfo: Temporary failure in name resolution) (SocketError)
from /usr/local/lib/ruby/3.0.0/net/http.rb:987:in `open'
from /usr/local/lib/ruby/3.0.0/net/http.rb:987:in `block in connect'
from /usr/local/lib/ruby/3.0.0/timeout.rb:97:in `block in timeout'
from /usr/local/lib/ruby/3.0.0/timeout.rb:107:in `timeout'
from /usr/local/lib/ruby/3.0.0/net/http.rb:985:in `connect'
from /usr/local/lib/ruby/3.0.0/net/http.rb:970:in `do_start'
from /usr/local/lib/ruby/3.0.0/net/http.rb:959:in `start'
from /usr/local/lib/ruby/3.0.0/net/http.rb:490:in `get_response'
from /usr/local/lib/ruby/3.0.0/net/http.rb:444:in `get_print'
(略)
ネットを遮断した状態でホスト上のプログラムをコンテナ内で実行できた。
sinatra + pumaでリクエストを受けて結果を返すWebサーバーを作れば同時アクセスはpumaが捌き、ファイルの後片付けはdockerがやってくれるだろう。
pumaで同時アクセスされてもいいように被らない一時的なディレクトリを作ってそこにプログラムを置いて実行すれば良さそう。(プログラム名をランダムにすると$0
とかがダサくなるからディレクトリの方をランダムな名前にしたい)
次は実行時間を30秒以内とかに制限したい。