Skip to content

Commit 403aadd

Browse files
gossijarlah
andauthored
Respect TESTCONTAINERS_RYUK_DISABLED ENV flag (#225)
* Respect `TESTCONTAINERS_RYUK_DISABLED` ENV flag * use properties and log a warning * use IO.puts * remove ryuk socket from setup --------- Co-authored-by: Jarl André Hübenthal <jarlah@protonmail.com>
1 parent 1faecdb commit 403aadd

1 file changed

Lines changed: 45 additions & 18 deletions

File tree

lib/testcontainers.ex

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,34 +50,20 @@ defmodule Testcontainers do
5050
defp setup(options) do
5151
{conn, docker_host_url, docker_host} = Connection.get_connection(options)
5252

53-
# Read properties first so we can configure Ryuk appropriately
53+
# Read testcontainer properties
5454
{:ok, properties} = PropertiesParser.read_property_sources()
5555

5656
session_id =
5757
:crypto.hash(:sha, "#{inspect(self())}#{DateTime.utc_now() |> DateTime.to_string()}")
5858
|> Base.encode16()
5959

60-
ryuk_privileged = Map.get(properties, "ryuk.container.privileged", "false") == "true"
61-
62-
ryuk_config =
63-
Container.new("testcontainers/ryuk:#{Constants.ryuk_version()}")
64-
|> Container.with_exposed_port(8080)
65-
|> then(&apply_docker_socket_volume_binding(&1, docker_host))
66-
|> Container.with_auto_remove(true)
67-
|> Container.with_privileged(ryuk_privileged)
68-
69-
with {:ok, _} <- Api.pull_image(ryuk_config.image, conn),
70-
{:ok, docker_hostname} <- get_docker_hostname(docker_host_url, conn),
71-
{:ok, ryuk_container_id} <- Api.create_container(ryuk_config, conn),
72-
:ok <- Api.start_container(ryuk_container_id, conn),
73-
{:ok, container} <- Api.get_container(ryuk_container_id, conn),
74-
{:ok, socket} <- create_ryuk_socket(container, docker_hostname),
75-
:ok <- register_ryuk_filter(session_id, socket) do
60+
with {:ok, docker_hostname} <- get_docker_hostname(docker_host_url, conn),
61+
{:ok} <- start_reaper(conn, session_id, properties, docker_host, docker_hostname),
62+
{:ok, properties} <- PropertiesParser.read_property_file() do
7663
Logger.info("Testcontainers initialized")
7764

7865
{:ok,
7966
%{
80-
socket: socket,
8167
conn: conn,
8268
docker_hostname: docker_hostname,
8369
session_id: session_id,
@@ -258,6 +244,47 @@ defmodule Testcontainers do
258244
GenServer.call(name, call, @timeout)
259245
end
260246

247+
defp start_reaper(conn, session_id, properties, docker_host, docker_hostname) do
248+
ryuk_disabled = Map.get(properties, "ryuk.disabled", "false") == "true"
249+
250+
case ryuk_disabled do
251+
true ->
252+
ryukDisabledMessage =
253+
"""
254+
********************************************************************************
255+
Ryuk has been disabled. This can cause unexpected behavior in your environment.
256+
********************************************************************************
257+
"""
258+
259+
IO.puts(ryukDisabledMessage)
260+
261+
{:ok, nil}
262+
263+
_ ->
264+
start_ryuk(conn, session_id, properties, docker_host, docker_hostname)
265+
end
266+
end
267+
268+
defp start_ryuk(conn, session_id, properties, docker_host, docker_hostname) do
269+
ryuk_privileged = Map.get(properties, "ryuk.container.privileged", "false") == "true"
270+
271+
ryuk_config =
272+
Container.new("testcontainers/ryuk:#{Constants.ryuk_version()}")
273+
|> Container.with_exposed_port(8080)
274+
|> then(&apply_docker_socket_volume_binding(&1, docker_host))
275+
|> Container.with_auto_remove(true)
276+
|> Container.with_privileged(ryuk_privileged)
277+
278+
with {:ok, _} <- Api.pull_image(ryuk_config.image, conn),
279+
{:ok, ryuk_container_id} <- Api.create_container(ryuk_config, conn),
280+
:ok <- Api.start_container(ryuk_container_id, conn),
281+
{:ok, container} <- Api.get_container(ryuk_container_id, conn),
282+
{:ok, socket} <- create_ryuk_socket(container, docker_hostname),
283+
:ok <- register_ryuk_filter(session_id, socket) do
284+
{:ok}
285+
end
286+
end
287+
261288
defp create_ryuk_socket(container, docker_hostname, reattempt_count \\ 0)
262289

263290
defp create_ryuk_socket(%Container{} = container, docker_hostname, reattempt_count)

0 commit comments

Comments
 (0)