add docker examples
This commit is contained in:
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
if [ ! -e main.go ]; then
|
||||
echo "Must be run in a directory that contains main.go."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -eux
|
||||
IMAGE_NAME="${1:-localhost/$(basename "$(pwd)"):latest}"
|
||||
podman manifest rm "${IMAGE_NAME}" || true
|
||||
podman image rm "${IMAGE_NAME}" || true
|
||||
buildah manifest create "${IMAGE_NAME}"
|
||||
for ARCH in amd64 arm64 386; do
|
||||
rm -f "main-${ARCH}"
|
||||
GOARCH="${ARCH}" go build -ldflags "-s -w" -o "main-${ARCH}" main.go
|
||||
|
||||
WORKING_CONTAINER="$(buildah from --arch "${ARCH}" scratch)"
|
||||
buildah copy "${WORKING_CONTAINER}" "main-${ARCH}" "/runme"
|
||||
buildah config --entrypoint '["/runme"]' "${WORKING_CONTAINER}"
|
||||
buildah commit --manifest "${IMAGE_NAME}" "${WORKING_CONTAINER}"
|
||||
|
||||
rm -f "main-${ARCH}"
|
||||
done
|
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
set -e
|
||||
|
||||
# Uncomment the container image to copy, and run this script to copy it.
|
||||
|
||||
DESTINATION_REPO=ansible-collections/community.docker
|
||||
|
||||
function convert_image {
|
||||
echo "========================================================================================================="
|
||||
local IMAGE_NAME="$1"
|
||||
local DEST_IMAGE="$2"
|
||||
echo "FROM ${IMAGE_NAME}" | podman build --annotation "org.opencontainers.image.source=https://github.com/${DESTINATION_REPO}" -t "ghcr.io/${DESTINATION_REPO}/${DEST_IMAGE}" -
|
||||
podman push "ghcr.io/${DESTINATION_REPO}/${DEST_IMAGE}"
|
||||
podman rmi "${IMAGE_NAME}"
|
||||
podman rmi "ghcr.io/${DESTINATION_REPO}/${DEST_IMAGE}"
|
||||
}
|
||||
|
||||
# convert_image docker.io/library/registry:2.6.1 docker-distribution:2.6.1
|
||||
# convert_image docker.io/library/registry:2.8.3 docker-distribution:2.8.3
|
||||
convert_image docker.io/library/python:3-alpine docker-python:3-alpine
|
@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
if [ ! -e main.go ]; then
|
||||
echo "Must be run in a directory that contains main.go."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROGRAMS="main is-healthy make-healthy"
|
||||
|
||||
set -eux
|
||||
IMAGE_NAME="${1:-localhost/$(basename "$(pwd)"):latest}"
|
||||
podman manifest rm "${IMAGE_NAME}" || true
|
||||
podman image rm "${IMAGE_NAME}" || true
|
||||
buildah manifest create "${IMAGE_NAME}"
|
||||
for ARCH in amd64 arm64 386; do
|
||||
for PROGRAM in ${PROGRAMS}; do
|
||||
rm -f "${PROGRAM}-${ARCH}"
|
||||
GOARCH="${ARCH}" go build -ldflags "-s -w" -o "${PROGRAM}-${ARCH}" "${PROGRAM}.go"
|
||||
done
|
||||
|
||||
# Need format=docker for health checks to work
|
||||
WORKING_CONTAINER="$(buildah from --arch "${ARCH}" --format docker scratch)"
|
||||
for PROGRAM in ${PROGRAMS}; do
|
||||
buildah copy "${WORKING_CONTAINER}" "${PROGRAM}-${ARCH}" "/${PROGRAM}"
|
||||
done
|
||||
buildah config --entrypoint '["/main"]' "${WORKING_CONTAINER}"
|
||||
buildah config --healthcheck 'CMD /is-healthy' "${WORKING_CONTAINER}"
|
||||
buildah config --healthcheck-interval 1s "${WORKING_CONTAINER}"
|
||||
buildah config --healthcheck-retries 1 "${WORKING_CONTAINER}"
|
||||
buildah config --healthcheck-start-period 10s "${WORKING_CONTAINER}"
|
||||
buildah commit --format docker --manifest "${IMAGE_NAME}" "${WORKING_CONTAINER}"
|
||||
|
||||
for PROGRAM in ${PROGRAMS}; do
|
||||
rm -f "${PROGRAM}-${ARCH}"
|
||||
done
|
||||
done
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
Copyright (c) Ansible Project
|
||||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
data, err := os.ReadFile("/health.txt")
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error while reading health status: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if bytes.Equal(data, []byte("healthy")) {
|
||||
fmt.Fprintf(os.Stdout, "Healthy.\n")
|
||||
os.Exit(0)
|
||||
}
|
||||
if bytes.Equal(data, []byte("unhealthy")) {
|
||||
fmt.Fprintf(os.Stdout, "Unhealthy!\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
if bytes.Equal(data, []byte("starting")) {
|
||||
fmt.Fprintf(os.Stdout, "Starting...\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "Unknown health status: %s\n", data)
|
||||
os.Exit(1)
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
/*
|
||||
Copyright (c) Ansible Project
|
||||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
os.WriteFile("health.txt", []byte("starting"), 0644)
|
||||
if len(os.Args) > 3 || len(os.Args) < 2 {
|
||||
fmt.Fprintf(os.Stderr, "%s must have 1 or 2 arguments, not %d arguments\n", os.Args[0], len(os.Args))
|
||||
os.Exit(1)
|
||||
}
|
||||
runtimeDelay, err := time.ParseDuration(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Cannot parse runtime duration: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if runtimeDelay.Microseconds() <= 0 {
|
||||
fmt.Fprintf(os.Stderr, "Delay must be positive!\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
var healthyDelay time.Duration
|
||||
if len(os.Args) == 3 {
|
||||
healthyDelay, err = time.ParseDuration(os.Args[2])
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Cannot parse healthy delay: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if healthyDelay.Microseconds() <= 0 {
|
||||
fmt.Fprintf(os.Stderr, "Healthy delay must not be negative!\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
if healthyDelay.Microseconds() > 0 {
|
||||
fmt.Fprintf(os.Stderr, "Waiting %s until setting to healthy...\n", healthyDelay)
|
||||
time.Sleep(healthyDelay)
|
||||
os.WriteFile("/health.txt", []byte("healthy"), 0644)
|
||||
fmt.Fprintf(os.Stderr, "Set state to healthy.\n")
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "Waiting %s until quitting...\n", runtimeDelay)
|
||||
time.Sleep(runtimeDelay)
|
||||
fmt.Fprintf(os.Stderr, "Goodbye.\n")
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
Copyright (c) Ansible Project
|
||||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func main() {
|
||||
healthy := true
|
||||
if len(os.Args) > 2 {
|
||||
fmt.Fprintf(os.Stderr, "%s must have 0 or 1 argument, not %d arguments\n", os.Args[0], len(os.Args))
|
||||
os.Exit(1)
|
||||
} else if len(os.Args) == 2 {
|
||||
var err error
|
||||
healthy, err = strconv.ParseBool(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Cannot parse boolean: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
var state []byte
|
||||
if healthy {
|
||||
state = []byte("healthy")
|
||||
} else {
|
||||
state = []byte("unhealthy")
|
||||
}
|
||||
os.WriteFile("/health.txt", state, 0644)
|
||||
}
|
@ -0,0 +1 @@
|
||||
../build.sh
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
Copyright (c) Ansible Project
|
||||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var delay time.Duration
|
||||
if len(os.Args) > 2 {
|
||||
fmt.Fprintf(os.Stderr, "%s must have 0 or 1 argument, not %d arguments\n", os.Args[0], len(os.Args))
|
||||
os.Exit(1)
|
||||
} else if len(os.Args) == 2 {
|
||||
var err error
|
||||
delay, err = time.ParseDuration(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Cannot parse delay duration: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if delay.Microseconds() < 0 {
|
||||
fmt.Fprintf(os.Stderr, "Delay must not be negative!\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
fmt.Println("Hello!")
|
||||
time.Sleep(delay)
|
||||
}
|
@ -0,0 +1 @@
|
||||
../build.sh
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
Copyright (c) Ansible Project
|
||||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var delay time.Duration
|
||||
if len(os.Args) > 2 {
|
||||
fmt.Fprintf(os.Stderr, "%s must have 0 or 1 argument, not %d arguments\n", os.Args[0], len(os.Args))
|
||||
os.Exit(1)
|
||||
} else if len(os.Args) == 2 {
|
||||
var err error
|
||||
delay, err = time.ParseDuration(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Cannot parse delay duration: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if delay.Microseconds() < 0 {
|
||||
fmt.Fprintf(os.Stderr, "Delay must not be negative!\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
fmt.Println("World!")
|
||||
time.Sleep(delay)
|
||||
}
|
Reference in New Issue
Block a user