-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add official image for OpenSearch #13161
base: master
Are you sure you want to change the base?
Conversation
Signed-off-by: Rishabh Singh <[email protected]>
Diff for ef46be1:diff --git a/_bashbrew-cat b/_bashbrew-cat
index bdfae4a..7735e7f 100644
--- a/_bashbrew-cat
+++ b/_bashbrew-cat
@@ -1 +1,7 @@
-Maintainers: New Image! :D (@docker-library-bot)
+Maintainers: OpenSearch Project Team <[email protected]> (@opensearch-project), Rishabh Singh <[email protected]> (@rishabh6788), Peter Zhu <[email protected]> (@peterzhuamazon), Prudhvi Godithi <[email protected]> (@prudhvigodithi)
+GitRepo: https://github.com/opensearch-project/docker-images.git
+
+Tags: 2.3.0, 2.3, 2, latest
+Architectures: amd64, arm64v8
+GitCommit: 6c23ffde45b4c37dfde9b057ca241c9fd8357bc4
+Directory: 2.x
diff --git a/_bashbrew-list b/_bashbrew-list
index e69de29..bae5bc7 100644
--- a/_bashbrew-list
+++ b/_bashbrew-list
@@ -0,0 +1,4 @@
+opensearch:2
+opensearch:2.3
+opensearch:2.3.0
+opensearch:latest
diff --git a/opensearch_latest/Dockerfile b/opensearch_latest/Dockerfile
new file mode 100644
index 0000000..9b630e5
--- /dev/null
+++ b/opensearch_latest/Dockerfile
@@ -0,0 +1,111 @@
+# Copyright OpenSearch Contributors
+# SPDX-License-Identifier: Apache-2.0
+
+
+# This dockerfile generates an AmazonLinux-based image containing an OpenSearch installation.
+# It assumes that the working directory contains these files: an OpenSearch tarball (opensearch.tgz), log4j2.properties, opensearch.yml, opensearch-docker-entrypoint.sh, opensearch-onetime-setup.sh.
+# Build arguments:
+# VERSION: Required. Used to label the image.
+# UID: Optional. Specify the opensearch userid. Defaults to 1000.
+# GID: Optional. Specify the opensearch groupid. Defaults to 1000.
+# OPENSEARCH_HOME: Optional. Specify the opensearch root directory. Defaults to /usr/share/opensearch.
+
+
+########################### Stage 0 ########################
+FROM amazonlinux:2 AS linux_stage_0
+
+ARG UID=1000
+ARG GID=1000
+ARG TEMP_DIR=/tmp/opensearch
+ARG OPENSEARCH_HOME=/usr/share/opensearch
+ARG OPENSEARCH_PATH_CONF=$OPENSEARCH_HOME/config
+ARG SECURITY_PLUGIN_DIR=$OPENSEARCH_HOME/plugins/opensearch-security
+ARG PERFORMANCE_ANALYZER_PLUGIN_CONFIG_DIR=$OPENSEARCH_PATH_CONF/opensearch-performance-analyzer
+ARG OS_VERSION=2.3.0
+# Update packages
+# Install the tools we need: tar and gzip to unpack the OpenSearch tarball, and shadow-utils to give us `groupadd` and `useradd`.
+# Install which to allow running of securityadmin.sh
+RUN yum update -y && yum install -y tar gzip shadow-utils which && yum clean all
+
+# Create an opensearch user, group, and directory
+RUN groupadd -g $GID opensearch && \
+ adduser -u $UID -g $GID -d $OPENSEARCH_HOME opensearch && \
+ mkdir $TEMP_DIR
+
+RUN mkdir /usr/share/elasticsearch
+WORKDIR /usr/share/elasticsearch
+
+RUN set -eux ; \
+ cur_arch="" ; \
+ case "$(arch)" in \
+ aarch64) cur_arch='arm64' ;; \
+ x86_64) cur_arch='x64' ;; \
+ *) echo >&2 ; echo >&2 "Unsupported architecture $(arch)" ; echo >&2 ; exit 1 ;; \
+ esac ; \
+ curl --retry 10 -S -L --output $TEMP_DIR/opensearch.tar.gz https://artifacts.opensearch.org/releases/bundle/opensearch/$OS_VERSION/opensearch-$OS_VERSION-linux-$cur_arch.tar.gz; \
+ curl --output $TEMP_DIR/opensearch.pgp https://artifacts.opensearch.org/publickeys/opensearch.pgp; \
+ gpg --import $TEMP_DIR/opensearch.pgp; \
+ curl --output $TEMP_DIR/opensearch.tar.gz.sig https://artifacts.opensearch.org/releases/bundle/opensearch/$OS_VERSION/opensearch-$OS_VERSION-linux-$cur_arch.tar.gz.sig; \
+ gpg --verify $TEMP_DIR/opensearch.tar.gz.sig $TEMP_DIR/opensearch.tar.gz;
+
+RUN tar --warning=no-timestamp -zxf $TEMP_DIR/opensearch.tar.gz -C $OPENSEARCH_HOME --strip-components=1 && \
+ mkdir -p $OPENSEARCH_HOME/data && chown -Rv $UID:$GID $OPENSEARCH_HOME/data && \
+ if [[ -d $SECURITY_PLUGIN_DIR ]] ; then chmod -v 750 $SECURITY_PLUGIN_DIR/tools/* ; fi && \
+ rm -rf $TEMP_DIR
+
+COPY config/* $OPENSEARCH_PATH_CONF/
+COPY bin/* $OPENSEARCH_HOME/
+RUN if [[ -d $PERFORMANCE_ANALYZER_PLUGIN_CONFIG_DIR ]] ; then mv $OPENSEARCH_PATH_CONF/performance-analyzer.properties $PERFORMANCE_ANALYZER_PLUGIN_CONFIG_DIR/ ; fi
+########################### Stage 1 ########################
+# Copy working directory to the actual release docker images
+FROM amazonlinux:2
+
+ARG UID=1000
+ARG GID=1000
+ARG OPENSEARCH_HOME=/usr/share/opensearch
+ARG OS_VERSION=2.3.0
+
+RUN yum update -y && yum install -y tar gzip shadow-utils which && yum clean all
+
+# Create an opensearch user, group
+RUN groupadd -g $GID opensearch && \
+ adduser -u $UID -g $GID -d $OPENSEARCH_HOME opensearch
+
+# Copy from Stage0
+COPY --from=linux_stage_0 --chown=$UID:$GID $OPENSEARCH_HOME $OPENSEARCH_HOME
+WORKDIR $OPENSEARCH_HOME
+
+# Set $JAVA_HOME
+RUN echo "export JAVA_HOME=$OPENSEARCH_HOME/jdk" >> /etc/profile.d/java_home.sh && \
+ echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java_home.sh
+ENV JAVA_HOME=$OPENSEARCH_HOME/jdk
+ENV PATH=$PATH:$JAVA_HOME/bin:$OPENSEARCH_HOME/bin
+
+# Add k-NN lib directory to library loading path variable
+ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$OPENSEARCH_HOME/plugins/opensearch-knn/lib"
+
+# Change user
+USER $UID
+
+
+# Setup OpenSearch
+# Disable security demo installation during image build, and allow user to disable during startup of the container
+# Enable security plugin during image build, and allow user to disable during startup of the container
+ARG DISABLE_INSTALL_DEMO_CONFIG=true
+ARG DISABLE_SECURITY_PLUGIN=false
+RUN ./opensearch-onetime-setup.sh
+
+EXPOSE 9200 9300 9600 9650
+
+# Label
+LABEL org.label-schema.schema-version="1.0" \
+ org.label-schema.name="opensearch" \
+ org.label-schema.version="$OS_VERSION" \
+ org.label-schema.url="https://opensearch.org" \
+ org.label-schema.vcs-url="https://github.com/OpenSearch" \
+ org.label-schema.license="Apache-2.0" \
+ org.label-schema.vendor="OpenSearch"
+
+# CMD to run
+ ENTRYPOINT ["./opensearch-docker-entrypoint.sh"]
+ CMD ["opensearch"]
diff --git a/opensearch_latest/bin/opensearch-docker-entrypoint.sh b/opensearch_latest/bin/opensearch-docker-entrypoint.sh
new file mode 100755
index 0000000..8784691
--- /dev/null
+++ b/opensearch_latest/bin/opensearch-docker-entrypoint.sh
@@ -0,0 +1,142 @@
+#!/bin/bash
+
+# Copyright OpenSearch Contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# This script specify the entrypoint startup actions for opensearch
+# It will start both opensearch and performance analyzer plugin cli
+# If either process failed, the entire docker container will be removed
+# in favor of a newly started container
+
+# Export OpenSearch Home
+export OPENSEARCH_HOME=/usr/share/opensearch
+export OPENSEARCH_PATH_CONF=$OPENSEARCH_HOME/config
+
+# The virtual file /proc/self/cgroup should list the current cgroup
+# membership. For each hierarchy, you can follow the cgroup path from
+# this file to the cgroup filesystem (usually /sys/fs/cgroup/) and
+# introspect the statistics for the cgroup for the given
+# hierarchy. Alas, Docker breaks this by mounting the container
+# statistics at the root while leaving the cgroup paths as the actual
+# paths. Therefore, OpenSearch provides a mechanism to override
+# reading the cgroup path from /proc/self/cgroup and instead uses the
+# cgroup path defined the JVM system property
+# opensearch.cgroups.hierarchy.override. Therefore, we set this value here so
+# that cgroup statistics are available for the container this process
+# will run in.
+export OPENSEARCH_JAVA_OPTS="-Dopensearch.cgroups.hierarchy.override=/ $OPENSEARCH_JAVA_OPTS"
+
+# Holds the PID of opensearch and performance analyzer processes.
+declare OPENSEARCH_PID
+declare PA_PID
+
+##Security Plugin
+function setupSecurityPlugin {
+ SECURITY_PLUGIN="opensearch-security"
+
+ if [ -d "$OPENSEARCH_HOME/plugins/$SECURITY_PLUGIN" ]; then
+ if [ "$DISABLE_INSTALL_DEMO_CONFIG" = "true" ]; then
+ echo "Disabling execution of install_demo_configuration.sh for OpenSearch Security Plugin"
+ else
+ echo "Enabling execution of install_demo_configuration.sh for OpenSearch Security Plugin"
+ bash $OPENSEARCH_HOME/plugins/$SECURITY_PLUGIN/tools/install_demo_configuration.sh -y -i -s
+ fi
+
+ if [ "$DISABLE_SECURITY_PLUGIN" = "true" ]; then
+ echo "Disabling OpenSearch Security Plugin"
+ opensearch_opt="-Eplugins.security.disabled=true"
+ opensearch_opts+=("${opensearch_opt}")
+ else
+ echo "Enabling OpenSearch Security Plugin"
+ fi
+ fi
+}
+
+# Trap function that is used to terminate opensearch and performance analyzer
+# when a relevant signal is caught.
+function terminateProcesses {
+ if kill -0 $OPENSEARCH_PID >& /dev/null; then
+ echo "Killing opensearch process $OPENSEARCH_PID"
+ kill -TERM $OPENSEARCH_PID
+ wait $OPENSEARCH_PID
+ fi
+ if kill -0 $PA_PID >& /dev/null; then
+ echo "Killing performance analyzer process $PA_PID"
+ kill -TERM $PA_PID
+ wait $PA_PID
+ fi
+}
+
+# Start up the opensearch and performance analyzer agent processes.
+# When either of them halts, this script exits, or we receive a SIGTERM or SIGINT signal then we want to kill both these processes.
+function runOpensearch {
+ # Files created by OpenSearch should always be group writable too
+ umask 0002
+
+ if [[ "$(id -u)" == "0" ]]; then
+ echo "OpenSearch cannot run as root. Please start your container as another user."
+ exit 1
+ fi
+
+ # Parse Docker env vars to customize OpenSearch
+ #
+ # e.g. Setting the env var cluster.name=testcluster
+ # will cause OpenSearch to be invoked with -Ecluster.name=testcluster
+ opensearch_opts=()
+ while IFS='=' read -r envvar_key envvar_value
+ do
+ # OpenSearch settings need to have at least two dot separated lowercase
+ # words, e.g. `cluster.name`, except for `processors` which we handle
+ # specially
+ if [[ "$envvar_key" =~ ^[a-z0-9_]+\.[a-z0-9_]+ || "$envvar_key" == "processors" ]]; then
+ if [[ ! -z $envvar_value ]]; then
+ opensearch_opt="-E${envvar_key}=${envvar_value}"
+ opensearch_opts+=("${opensearch_opt}")
+ fi
+ fi
+ done < <(env)
+
+ setupSecurityPlugin
+
+ # Enable job control so we receive SIGCHLD when a child process terminates
+ set -m
+
+ # Make sure we terminate the child processes in the event of us received TERM (e.g. "docker container stop"), INT (e.g. ctrl-C), EXIT (this script terminates for an unexpected reason), or CHLD (one of the processes terminated unexpectedly)
+ trap terminateProcesses TERM INT EXIT CHLD
+
+ # Start opensearch
+ "$@" "${opensearch_opts[@]}" &
+ OPENSEARCH_PID=$!
+
+ # Start performance analyzer agent
+ $OPENSEARCH_HOME/bin/opensearch-performance-analyzer/performance-analyzer-agent-cli > $OPENSEARCH_HOME/logs/performance-analyzer.log 2>&1 &
+ PA_PID=$!
+
+ # Wait for the child processes to terminate
+ wait $OPENSEARCH_PID
+ local opensearch_exit_code=$?
+ echo "OpenSearch exited with code ${opensearch_exit_code}"
+
+ wait $PA_PID
+ echo "Performance analyzer exited with code $?"
+
+ # This script should exit with the same code as the opensearch command, but
+ # it would be a breaking change. Next line should be uncommented for the
+ # next major release.
+ # exit ${opensearch_exit_code}
+}
+
+# Prepend "opensearch" command if no argument was provided or if the first
+# argument looks like a flag (i.e. starts with a dash).
+if [ $# -eq 0 ] || [ "${1:0:1}" = '-' ]; then
+ set -- opensearch "$@"
+fi
+
+if [ "$1" = "opensearch" ]; then
+ # If the first argument is opensearch, then run the setup script.
+ runOpensearch "$@"
+else
+ # Otherwise, just exec the command.
+ exec "$@"
+fi
+
diff --git a/opensearch_latest/bin/opensearch-onetime-setup.sh b/opensearch_latest/bin/opensearch-onetime-setup.sh
new file mode 100755
index 0000000..2b6f6db
--- /dev/null
+++ b/opensearch_latest/bin/opensearch-onetime-setup.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# SPDX-License-Identifier: Apache-2.0
+#
+# The OpenSearch Contributors require contributions made to
+# this file be licensed under the Apache-2.0 license or a
+# compatible open source license.
+
+# This script performs one-time setup for the OpenSearch tarball distribution.
+# It installs a demo security config and sets up the performance analyzer
+
+export OPENSEARCH_HOME=`dirname $(realpath $0)`
+export OPENSEARCH_PATH_CONF=$OPENSEARCH_HOME/config
+cd $OPENSEARCH_HOME
+
+##Security Plugin
+SECURITY_PLUGIN="opensearch-security"
+if [ -d "$OPENSEARCH_HOME/plugins/$SECURITY_PLUGIN" ]; then
+ if [ "$DISABLE_INSTALL_DEMO_CONFIG" = "true" ]; then
+ echo "Disabling execution of install_demo_configuration.sh for OpenSearch Security Plugin"
+ else
+ echo "Enabling execution of install_demo_configuration.sh for OpenSearch Security Plugin"
+ bash $OPENSEARCH_HOME/plugins/$SECURITY_PLUGIN/tools/install_demo_configuration.sh -y -i -s
+ fi
+
+ if [ "$DISABLE_SECURITY_PLUGIN" = "true" ]; then
+ echo "Disabling OpenSearch Security Plugin"
+ sed -i '/plugins.security.disabled/d' $OPENSEARCH_PATH_CONF/opensearch.yml
+ echo "plugins.security.disabled: true" >> $OPENSEARCH_PATH_CONF/opensearch.yml
+ else
+ echo "Enabling OpenSearch Security Plugin"
+ sed -i '/plugins.security.disabled/d' $OPENSEARCH_PATH_CONF/opensearch.yml
+ fi
+fi
+
+##Perf Plugin
+PA_PLUGIN="opensearch-performance-analyzer"
+
+if ! grep -q '## OpenDistro Performance Analyzer' $OPENSEARCH_PATH_CONF/jvm.options; then
+ CLK_TCK=`/usr/bin/getconf CLK_TCK`
+ echo >> $OPENSEARCH_PATH_CONF/jvm.options
+ echo '## OpenDistro Performance Analyzer' >> $OPENSEARCH_PATH_CONF/jvm.options
+ echo "-Dclk.tck=$CLK_TCK" >> $OPENSEARCH_PATH_CONF/jvm.options
+ echo "-Djdk.attach.allowAttachSelf=true" >> $OPENSEARCH_PATH_CONF/jvm.options
+ echo "-Djava.security.policy=$OPENSEARCH_PATH_CONF/$PA_PLUGIN/opensearch_security.policy" >> $OPENSEARCH_PATH_CONF/jvm.options
+ echo "--add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED" >> $OPENSEARCH_PATH_CONF/jvm.options
+fi
+
+
diff --git a/opensearch_latest/config/log4j2.properties b/opensearch_latest/config/log4j2.properties
new file mode 100755
index 0000000..9ad290a
--- /dev/null
+++ b/opensearch_latest/config/log4j2.properties
@@ -0,0 +1,9 @@
+status = error
+
+appender.console.type = Console
+appender.console.name = console
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
+
+rootLogger.level = info
+rootLogger.appenderRef.console.ref = console
diff --git a/opensearch_latest/config/opensearch.yml b/opensearch_latest/config/opensearch.yml
new file mode 100644
index 0000000..6641eed
--- /dev/null
+++ b/opensearch_latest/config/opensearch.yml
@@ -0,0 +1,12 @@
+---
+cluster.name: docker-cluster
+
+# Bind to all interfaces because we don't know what IP address Docker will assign to us.
+network.host: 0.0.0.0
+
+# # minimum_master_nodes need to be explicitly set when bound on a public IP
+# # set to 1 to allow single node clusters
+# discovery.zen.minimum_master_nodes: 1
+
+# Setting network.host to a non-loopback address enables the annoying bootstrap checks. "Single-node" mode disables them again.
+# discovery.type: single-node
diff --git a/opensearch_latest/config/performance-analyzer.properties b/opensearch_latest/config/performance-analyzer.properties
new file mode 100755
index 0000000..5fec62f
--- /dev/null
+++ b/opensearch_latest/config/performance-analyzer.properties
@@ -0,0 +1,48 @@
+ # ======================== OpenSearch performance analyzer plugin config =========================
+
+# NOTE: this is an example for Linux. Please modify the config accordingly if you are using it under other OS.
+
+# Metrics data location
+metrics-location = /dev/shm/performanceanalyzer/
+
+# Metrics deletion interval (minutes) for metrics data.
+# Interval should be between 1 to 60.
+metrics-deletion-interval = 1
+
+# If set to true, the system cleans up the files behind it. So at any point, we should expect only 2
+# metrics-db-file-prefix-path files. If set to false, no files are cleaned up. This can be useful, if you are archiving
+# the files and wouldn't like for them to be cleaned up.
+cleanup-metrics-db-files = true
+
+# WebService exposed by App's port
+webservice-listener-port = 9600
+
+# Port for RPC Communication
+rpc-port = 9650
+
+# Metric DB File Prefix Path location
+metrics-db-file-prefix-path = /tmp/metricsdb_
+
+https-enabled = false
+
+# Setup the correct path for server certificates
+certificate-file-path = none
+private-key-file-path = none
+#trusted-cas-file-path = none
+
+# Setup the correct path for client certificates (by default, the client will just use the server certificates)
+#client-certificate-file-path = specify_path
+#client-private-key-file-path = specify_path
+#client-trusted-cas-file-path = specify_path
+
+# WebService bind host; default only to local interface
+webservice-bind-host = 0.0.0.0
+
+# Plugin Stats Metadata file name, expected to be in the same location
+plugin-stats-metadata = plugin-stats-metadata
+
+# Agent Stats Metadata file name, expected to be in the same location
+agent-stats-metadata = agent-stats-metadata
+
+
+ |
1 similar comment
Hello! ✨ Thanks for your interest in contributing to the official images program. 💭 As you may have noticed, we've usually got a pretty decently sized queue of new images (not to mention image updates and maintenance of images under @docker-library which are maintained by the core official images team). As such, it may be some time before we get to reviewing this image (image updates get priority both because users expect them and because reviewing new images is a more involved process than reviewing updates), so we apologize in advance! Please be patient with us -- rest assured, we've seen your PR and it's in the queue. ❤️ We do try to proactively add and update the "new image checklist" on each PR, so if you haven't looked at it yet, that's a good use of time while you wait. ☔ Thanks! 💖 💙 💚 ❤️ |
Thank you for your patience 🙇 Many of my feedback items from #13194 (comment) are relevant here (as the +RUN mkdir /usr/share/elasticsearch
+WORKDIR /usr/share/elasticsearch This is a little weird -- what does this do differently than just + mkdir -p $OPENSEARCH_HOME/data && chown -Rv $UID:$GID $OPENSEARCH_HOME/data && \
+ if [[ -d $SECURITY_PLUGIN_DIR ]] ; then chmod -v 750 $SECURITY_PLUGIN_DIR/tools/* ; fi && \
+ rm -rf $TEMP_DIR Without the +RUN if [[ -d $PERFORMANCE_ANALYZER_PLUGIN_CONFIG_DIR ]] ; then mv $OPENSEARCH_PATH_CONF/performance-analyzer.properties $PERFORMANCE_ANALYZER_PLUGIN_CONFIG_DIR/ ; fi This being conditional makes it a little hard to determine whether it applies to the final build -- is this plugin enabled/included by default? Does this config exist/get moved? +# Set $JAVA_HOME
+RUN echo "export JAVA_HOME=$OPENSEARCH_HOME/jdk" >> /etc/profile.d/java_home.sh && \
+ echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java_home.sh How common is it going to be for users to create interactive sessions within this image that aren't created by their container runtime (and thus don't inherit the +# Add k-NN lib directory to library loading path variable
+ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$OPENSEARCH_HOME/plugins/opensearch-knn/lib" This is fine, but for the sake of non-container users you might want to consider setting +# Setup OpenSearch
+# Disable security demo installation during image build, and allow user to disable during startup of the container
+# Enable security plugin during image build, and allow user to disable during startup of the container
+ARG DISABLE_INSTALL_DEMO_CONFIG=true
+ARG DISABLE_SECURITY_PLUGIN=false
+RUN ./opensearch-onetime-setup.sh There's a lot to unpack here -- is this "onetime setup" script intended to be user-facing? If so, why is it specific to the Dockerization and not part of the standard OpenSearch distribution? (See also https://github.com/docker-library/official-images#clarity) + # Start opensearch
+ "$@" "${opensearch_opts[@]}" &
+ OPENSEARCH_PID=$! Writing a process supervisor in shell is very ambitious (https://github.com/docker-library/official-images#init) -- can these two processes not be run as separate containers and thus let the container orchestrator manage and monitor their lifecycles independently? If not, can they be more directly integrated somehow to no longer require such tight coupling at the process level? |
I'm updating the status of this PR to "draft" for now. When it's ready for re-review, please remove the draft status and leave a comment (GitHub unfortunately does not notify maintainers for draft state changes). |
Signed-off-by: Rishabh Singh [email protected]
OpenSearch is a community-driven, Apache 2.0-licensed open source search and analytics suite that makes it easy to ingest, search, visualize, and analyze data. Developers build with OpenSearch for use cases such as application search, log analytics, data observability, data ingestion, and more.
To know more about OpenSearch please read our documentation
Checklist for Review
NOTE: This checklist is intended for the use of the Official Images maintainers both to track the status of your PR and to help inform you and others of where we're at. As such, please leave the "checking" of items to the repository maintainers. If there is a point below for which you would like to provide additional information or note completion, please do so by commenting on the PR. Thanks! (and thanks for staying patient with us ❤️)
foobar
needs Node.js, hasFROM node:...
instead of grabbingnode
via other means been considered?)ifFROM scratch
, tarballs only exist in a single commit within the associated history?