Skip to content

Commit

Permalink
[grid] Build docker images for Grid components
Browse files Browse the repository at this point in the history
As the readme in this diff suggests, this expects everything to be
pushed to a local container.

This is a strawman diff to help bootstrap some explorations of how to
actually build and deploy these docker images (especially as part of a
k8s deployment) It's possible we'll move the actual image creation to
the docker-selenium project at a later date. For now, this allows
rapid iteration without needing to check out multiple projects.
  • Loading branch information
shs96c committed Jan 16, 2020
1 parent 18dfc4c commit 705362f
Show file tree
Hide file tree
Showing 4 changed files with 233 additions and 0 deletions.
54 changes: 54 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,57 @@ py_repositories()
load("@rules_python//python:pip.bzl", "pip_repositories")

pip_repositories()

http_archive(
name = "io_bazel_rules_docker",
sha256 = "df13123c44b4a4ff2c2f337b906763879d94871d16411bf82dcfeba892b58607",
strip_prefix = "rules_docker-0.13.0",
urls = [
"https://github.com/bazelbuild/rules_docker/releases/download/v0.13.0/rules_docker-v0.13.0.tar.gz",
],
)

http_archive(
name = "rules_pkg",
url = "https://github.com/bazelbuild/rules_pkg/releases/download/0.2.4/rules_pkg-0.2.4.tar.gz",
sha256 = "4ba8f4ab0ff85f2484287ab06c0d871dcb31cc54d439457d28fd4ae14b18450a",
)

load(
"@io_bazel_rules_docker//repositories:repositories.bzl",
container_repositories = "repositories",
)
container_repositories()

load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps")

container_deps()

load(
"@io_bazel_rules_docker//container:container.bzl",
"container_pull",
)

container_pull(
name = "java_image_base",
registry = "gcr.io",
repository = "distroless/java",
# This pulls the java 11 version of the jave base image
digest = "sha256:f9fe0de7f8ded68f757d99e9d165b96e89e00d4cef80d204aa76bc0b8ffc4576",
)

container_pull(
name = "java_debug_image_base",
registry = "gcr.io",
repository = "distroless/java",
# Java 11 debug
digest = "sha256:6c5cee837b874e700995690e65fd8c16ea2c4b028a6bba16a34b0b06de35d2f8",
)

container_pull(
name = "firefox-standalone",
registry = "index.docker.io",
repository = "selenium/standalone-firefox",
# selenium/standalone-firefox:3.141.59
digest = "sha256:98d0cf6284a1560117811a7a47f95b38d81bd1fbd78551bcc58fa986abf2cb55",
)
165 changes: 165 additions & 0 deletions deploys/docker/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package(default_visibility = ["//deploys/k8s:__pkg__"])

load("@io_bazel_rules_docker//java:image.bzl", "java_image")
load("@io_bazel_rules_docker//contrib:passwd.bzl", "passwd_entry", "passwd_file")
load("@io_bazel_rules_docker//container:container.bzl", "container_image")
load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_push")
load("@rules_pkg//:pkg.bzl", "pkg_tar")

REGISTRY = "localhost:5000"

# Create a passwd file with a root and selenium user and uid.
passwd_entry(
username = "root",
uid = 0,
gid = 0,
name = "root_user",
)

passwd_entry(
username = "seluser",
info = "Selenium User",
uid = 1002,
name = "seluser",
home = "/home/seluser",
)

passwd_file(
name = "passwd",
entries = [
":root_user",
":seluser",
],
)

pkg_tar(
name = "passwd-tar",
srcs = [":passwd"],
mode = "0o644",
package_dir = "etc",
)

ENTRY_POINT = [
"java", "-jar", "/app/selenium_server_deploy.jar"
]

container_image(
name = "passwd-image",
base = "@java_debug_image_base//image",
tars = [":passwd-tar"],
)

container_image(
name = "grid-base",
base = ":passwd-image",
directory = "/app",
files = [
"//java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar",
],
workdir = "/app",
user = "seluser",
)

container_image(
name = "grid-debug-base",
base = ":passwd-image",
directory = "/app",
files = [
"//java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar",
],
workdir = "/app",
user = "seluser",
)

container_push(
name = "push-distributor",
format = "Docker",
image = ":distributor-image",
registry = REGISTRY,
repository = "selenium/distributor",
)

container_image(
name = "distributor-image",
base = ":grid-base",
entrypoint = ENTRY_POINT + ["distributor"],
ports = [
"5553/tcp", # Web
],
)

container_push(
name = "push-message-bus",
format = "Docker",
image = ":message-bus-image",
registry = REGISTRY,
repository = "selenium/message-bus",
)

container_image(
name = "message-bus-image",
base = ":grid-base",
entrypoint = ENTRY_POINT + ["message-bus"],
ports = [
"5557/tcp", # Web
"4442/tcp", # ZeroMQ
"4443/tcp",
],
)

container_push(
name = "push-router",
format = "Docker",
image = ":router-image",
registry = REGISTRY,
repository = "selenium/router",
)

container_image(
name = "router-image",
base = ":grid-base",
entrypoint = ENTRY_POINT + ["router"],
ports = [
"4444/tcp",
],
)

container_push(
name = "push-session-map",
format = "Docker",
image = ":session-map-image",
registry = REGISTRY,
repository = "selenium/session-map",
)

container_image(
name = "session-map-image",
base = ":grid-base",
entrypoint = ENTRY_POINT + ["sessions"],
ports = [
"5556/tcp", # Web
"4442/tcp", # ZeroMQ
"4443/tcp",
],
)

container_push(
name = "push-firefox-node",
format = "Docker",
image = ":firefox-node-image",
registry = REGISTRY,
repository = "selenium/firefox-node",
)

container_image(
name = "firefox-node-image",
base = "@firefox-standalone//image",
directory = "/app",
files = ["//java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar"],
user = "seluser",
entrypoint = ["java", "-jar", "/app/selenium_server_deploy.jar", "node", "-p", "4444", "--detect-drivers"],
cmd = None,
ports = [
"4444/tcp",
]
)
13 changes: 13 additions & 0 deletions deploys/docker/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Building Docker images

The docker images here are configured to be deployed to a docker registry
running locally. This can be started by:

1. Install docker for your machine. You may want to configure it to use
more memory and CPU than it defaults to.
1. Following the steps to set up a [local registry](https://docs.docker.com/registry/deploying/#run-a-local-registry).
2. Verify the registry works as expected by following [these steps](https://docs.docker.com/registry/deploying/#copy-an-image-from-docker-hub-to-your-registry).

If you're feeling brave: `docker run -d -p 5000:5000 --restart=always --name registry registry:2.7.1`

It is assumed that the registry will be available at http://localhost:5000.
1 change: 1 addition & 0 deletions java/server/src/org/openqa/selenium/grid/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ java_binary(
main_class = "org.openqa.selenium.grid.Main",
visibility = [
"//:__pkg__",
"//deploys/docker:__pkg__",
"//py:__pkg__",
],
runtime_deps = [
Expand Down

0 comments on commit 705362f

Please sign in to comment.