diff --git a/.github/workflows/base.yml b/.github/workflows/base.yml new file mode 100644 index 0000000..2252d30 --- /dev/null +++ b/.github/workflows/base.yml @@ -0,0 +1,34 @@ +name: Docker Image CI + +on: [push] + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + node-version: [10.x] + os: [ubuntu-latest, windows-latest] + + steps: + - uses: actions/checkout@v1 + - name: Build the Docker image + run: bash base/build.sh + env: + CI_PLATFORM: ${{ matrix.os }} + DOCKER_HUB_USER: ${{ secrets.DOCKER_HUB_USER }} + DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_TOKEN }} + + manifest: + needs: build + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Build the Docker manifest + run: bash base/manifest.sh + env: + DOCKER_HUB_USER: ${{ secrets.DOCKER_HUB_USER }} + DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_TOKEN }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index bff9ee3..0000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Docker Image CI - -on: [push] - -jobs: - build: - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - node-version: [10.x] - os: [ubuntu-18.04, windows-2019] - - steps: - - uses: actions/checkout@v1 - - name: Build the Docker image - run: bash build.sh - env: - CI_PLATFORM: ${{ matrix.os }} - DOCKER_HUB_USER: hongaar - DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} - - manifest: - needs: build - runs-on: ubuntu-18.04 - - steps: - - uses: actions/checkout@v1 - - name: Build the Docker manifest - run: bash manifest.sh - env: - DOCKER_HUB_USER: hongaar - DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} \ No newline at end of file diff --git a/.github/workflows/rabbitmq.yml b/.github/workflows/rabbitmq.yml new file mode 100644 index 0000000..f3c9b13 --- /dev/null +++ b/.github/workflows/rabbitmq.yml @@ -0,0 +1,32 @@ +name: Build CI + +on: [push] + +env: + RABBITMQ_VERSION: 3.8.6 + +jobs: + build: + runs-on: windows-2019 + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v1 + # - uses: satackey/action-docker-layer-caching@v0.0.5 + - name: build + run: | + cd rabbitmq + docker build --build-arg VERSION=$RABBITMQ_VERSION --file Dockerfile.windows --tag exivity/rabbitmq:$RABBITMQ_VERSION . + docker tag exivity/rabbitmq:$RABBITMQ_VERSION exivity/rabbitmq:latest + - name: test + run: ./rabbitmq/test.sh + - name: login + run: echo $DOCKER_HUB_TOKEN | docker login -u $DOCKER_HUB_USER --password-stdin + env: + DOCKER_HUB_USER: ${{ secrets.DOCKER_HUB_USER }} + DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }} + - name: push + run: | + docker push exivity/rabbitmq:$RABBITMQ_VERSION + docker push exivity/rabbitmq:latest diff --git a/README.md b/README.md index b49d994..9ab76a6 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,4 @@ -# exivity/docker +# Exivity Docker images -Docker base images used at Exivity. - -## tags - -### :latest - -Multiarch image containing both Windows and Linux images. - -### :windows - -_mcr.microsoft.com/windows/servercore:1903_ - -- PowerShell 6.2.0 -- Node 10.15.3 -- Visual C++ Redistributable for Visual Studio 2015 -- Yarn 1.13.0 -- Git for Windows 2.20.1 - -notes: -- previously, we used _mcr.microsoft.com/windows/nanoserver:1903_ but this turned out to be incompatible with nginx, see https://social.msdn.microsoft.com/Forums/en-US/7c30cb71-d449-4910-8bf5-f56023f7218e/nginx-in-nanoserver-container - -### :linux - -_ubuntu:latest_ - -- zip -- unzip +- [exivity/base](base/README.md) +- [exivity/rabbitmq](rabbitmq/README.md) diff --git a/Dockerfile.linux b/base/Dockerfile.linux similarity index 100% rename from Dockerfile.linux rename to base/Dockerfile.linux diff --git a/Dockerfile.windows b/base/Dockerfile.windows similarity index 100% rename from Dockerfile.windows rename to base/Dockerfile.windows diff --git a/LICENSE b/base/LICENSE similarity index 100% rename from LICENSE rename to base/LICENSE diff --git a/base/README.md b/base/README.md new file mode 100644 index 0000000..b49d994 --- /dev/null +++ b/base/README.md @@ -0,0 +1,29 @@ +# exivity/docker + +Docker base images used at Exivity. + +## tags + +### :latest + +Multiarch image containing both Windows and Linux images. + +### :windows + +_mcr.microsoft.com/windows/servercore:1903_ + +- PowerShell 6.2.0 +- Node 10.15.3 +- Visual C++ Redistributable for Visual Studio 2015 +- Yarn 1.13.0 +- Git for Windows 2.20.1 + +notes: +- previously, we used _mcr.microsoft.com/windows/nanoserver:1903_ but this turned out to be incompatible with nginx, see https://social.msdn.microsoft.com/Forums/en-US/7c30cb71-d449-4910-8bf5-f56023f7218e/nginx-in-nanoserver-container + +### :linux + +_ubuntu:latest_ + +- zip +- unzip diff --git a/build.sh b/base/build.sh old mode 100755 new mode 100644 similarity index 100% rename from build.sh rename to base/build.sh diff --git a/manifest.sh b/base/manifest.sh old mode 100755 new mode 100644 similarity index 100% rename from manifest.sh rename to base/manifest.sh diff --git a/rabbitmq/Dockerfile.windows b/rabbitmq/Dockerfile.windows new file mode 100644 index 0000000..c220d24 --- /dev/null +++ b/rabbitmq/Dockerfile.windows @@ -0,0 +1,34 @@ +FROM mcr.microsoft.com/windows/servercore:ltsc2019 + +ARG VERSION + +USER ContainerAdministrator + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] + +ENV VERSION=$VERSION +ENV chocolateyUseWindowsCompression false +ENV ERLANG_SERVICE_MANAGER_PATH="C:\Program Files\erl10.7\erts-10.7\bin" +ENV RABBITMQ_SERVER="C:\Program Files\RabbitMQ Server\rabbitmq_server-${VERSION}" + +RUN iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); \ + choco install -y curl; +RUN choco install -y erlang --version 22.3 +RUN curl ('https://github.com/rabbitmq/rabbitmq-server/releases/download/v{0}/rabbitmq-server-windows-{0}.zip' -f $env:VERSION) -o $env:TEMP\rabbitmq-server.zip; \ + Expand-Archive "$env:TEMP\rabbitmq-server.zip" -DestinationPath 'C:\Program Files\RabbitMQ Server'; \ + del "$env:TEMP\rabbitmq-server.zip"; + +COPY healthcheck.cmd C:/ +COPY enabled_plugins C:/Users/ContainerAdministrator/AppData/Roaming/RabbitMQ/ +COPY rabbitmq.conf C:/Users/ContainerAdministrator/AppData/Roaming/RabbitMQ/ + +EXPOSE 4369 +EXPOSE 5671 +EXPOSE 5672 +EXPOSE 15672 + +HEALTHCHECK --interval=5s --timeout=60s CMD C:/healthcheck.cmd + +WORKDIR C:/Program\ Files/RabbitMQ\ Server/rabbitmq_server-${VERSION}/sbin + +CMD .\rabbitmq-server.bat diff --git a/rabbitmq/README.md b/rabbitmq/README.md new file mode 100644 index 0000000..f150921 --- /dev/null +++ b/rabbitmq/README.md @@ -0,0 +1,41 @@ +# exivity:rabbitmq + +Builds Docker images of Rabbit MQ server, currently only on Windows. + +## Commands during development + +``` +export $RABBITMQ_VERSION=3.8.6 +``` + +Build: + +``` +docker build --build-arg VERSION=$RABBITMQ_VERSION --file Dockerfile.windows --tag exivity/rabbitmq:$RABBITMQ_VERSION . +``` + +Run interactively: + +``` +docker run --rm -it -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15672:15672 --name rabbitmq exivity/rabbitmq:$RABBITMQ_VERSION +``` + +Run in background: + +``` +docker run --rm --detach -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15672:15672 --name rabbitmq exivity/rabbitmq:$RABBITMQ_VERSION +``` + +Attach shell to running container: + +``` +docker exec -it rabbitmq cmd.exe +``` + +Then, i.e. follow log file: + +``` +powershell +Get-Content C:\Users\ +ContainerAdministrator\AppData\Roaming\RabbitMQ\log\rabbit@HOSTNAME.log Wait +``` diff --git a/rabbitmq/enabled_plugins b/rabbitmq/enabled_plugins new file mode 100644 index 0000000..9eafc41 --- /dev/null +++ b/rabbitmq/enabled_plugins @@ -0,0 +1 @@ +[rabbitmq_amqp1_0,rabbitmq_management]. diff --git a/rabbitmq/healthcheck.cmd b/rabbitmq/healthcheck.cmd new file mode 100644 index 0000000..2770d8e --- /dev/null +++ b/rabbitmq/healthcheck.cmd @@ -0,0 +1,4 @@ +REM curl --connect-timeout 5 --max-time 60 --retry 1 --user guest:guest http://localhost:15672/api/healthchecks/node + +cd "C:/Program Files/RabbitMQ Server/rabbitmq_server-%VERSION%/sbin" +rabbitmqctl.bat ping diff --git a/rabbitmq/rabbitmq.conf b/rabbitmq/rabbitmq.conf new file mode 100644 index 0000000..266ca8f --- /dev/null +++ b/rabbitmq/rabbitmq.conf @@ -0,0 +1,6 @@ +# DANGER ZONE! +# +# allowing remote connections for default user is highly discouraged +# as it dramatically decreases the security of the system. Delete the user +# instead and create a new one with generated secure credentials. +loopback_users = none diff --git a/rabbitmq/test.sh b/rabbitmq/test.sh new file mode 100644 index 0000000..9bb22c2 --- /dev/null +++ b/rabbitmq/test.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +healthy=healthy + +# https://gist.github.com/sj26/88e1c6584397bb7c13bd11108a579746 +function retry { + local retries=$1 + shift + + local count=0 + until "$@"; do + exit=$? + wait=$((2 ** $count)) + count=$(($count + 1)) + if [ $count -lt $retries ]; then + echo "Retry $count/$retries exited $exit, retrying in $wait seconds..." + sleep $wait + else + echo "Retry $count/$retries exited $exit, no more retries left." + return $exit + fi + done + return 0 +} + +function health { + docker inspect --format='{{json .State.Health.Status}}' rabbitmq +} + +function test { + status=`health` + + echo "Got status $status" + + [ $status = "\"$healthy\"" ] +} + +set -e + +docker run \ + --rm \ + --detach \ + -p 4369:4369 \ + -p 5671:5671 \ + -p 5672:5672 \ + -p 15672:15672 \ + --name rabbitmq \ + exivity/rabbitmq:latest + +retry 10 test + +docker stop rabbitmq