diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..ccc050d0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,108 @@ +FROM zonemaster/cli:local AS build + +ARG version + +USER root + +RUN apk add --no-cache \ + make \ + curl \ + gcc \ + perl-dev \ + musl-dev \ + perl-app-cpanminus + +RUN apk add --no-cache \ + jq \ + perl-class-method-modifiers \ + perl-config-inifiles \ + perl-dbd-sqlite \ + perl-dbi \ + perl-file-share \ + perl-file-slurp \ + perl-html-parser \ + perl-http-parser-xs \ + perl-mojolicious \ + perl-io-stringy \ + perl-log-any \ + perl-log-dispatch \ + perl-moose \ + perl-parallel-forkmanager \ + perl-plack \ + perl-role-tiny \ + perl-test-nowarnings \ + perl-test-differences \ + perl-test-exception \ + perl-try-tiny \ + perl-doc + +# for METRIC +RUN cpanm --notest --no-wget --from https://cpan.metacpan.org/ \ + Net::Statsd + +COPY ./Zonemaster-Backend-${version}.tar.gz ./Zonemaster-Backend-${version}.tar.gz + +RUN cpanm --notest --no-wget --from https://cpan.metacpan.org \ + ./Zonemaster-Backend-${version}.tar.gz + + +FROM zonemaster/cli:local +USER root + +COPY --from=build /usr/local/share/perl5 /usr/local/share/perl5 +COPY --from=build /usr/local/bin/ /usr/local/bin/ +COPY --from=build /usr/lib/perl5 /usr/lib/perl5 + +RUN apk add --no-cache \ + jq \ + perl-config-inifiles \ + perl-mojolicious \ + perl-moose \ + perl-dbi \ + perl-dbd-sqlite \ + perl-plack \ + perl-parallel-forkmanager + +# Create zonemaster user and group +RUN addgroup -S zonemaster +RUN adduser -S zonemaster -G zonemaster + +RUN cd `perl -MFile::ShareDir=dist_dir -E 'say dist_dir("Zonemaster-Backend")'` && \ + install -v -m 755 -d /etc/zonemaster && \ + install -v -m 775 -g zonemaster -d /var/log/zonemaster && \ + install -v -m 640 -g zonemaster ./backend_config.ini /etc/zonemaster/ + + +# Init SQLite database +RUN install -v -m 755 -o zonemaster -g zonemaster -d /var/lib/zonemaster +USER zonemaster +RUN $(perl -MFile::ShareDir -le 'print File::ShareDir::dist_dir("Zonemaster-Backend")')/create_db.pl +USER zonemaster +COPY zonemaster_launch /usr/local/bin + +USER root +ARG S6_OVERLAY_VERSION=3.2.1.0 + +# Install S6 +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz +ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp +RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz + + +# RPCAPI service +RUN mkdir /etc/s6-overlay/s6-rc.d/rpcapi +RUN echo "longrun" > /etc/s6-overlay/s6-rc.d/rpcapi/type +RUN echo "#!/command/with-contenv sh" > /etc/s6-overlay/s6-rc.d/rpcapi/run +RUN echo "zonemaster_launch rpcapi" >> /etc/s6-overlay/s6-rc.d/rpcapi/run + +# TESTAGENT sevice +RUN mkdir /etc/s6-overlay/s6-rc.d/testagent +RUN echo "longrun" > /etc/s6-overlay/s6-rc.d/testagent/type +RUN echo "#!/command/with-contenv sh" > /etc/s6-overlay/s6-rc.d/testagent/run +RUN echo "zonemaster_launch testagent" >> /etc/s6-overlay/s6-rc.d/testagent/run + +RUN touch /etc/s6-overlay/s6-rc.d/user/contents.d/rpcapi +RUN touch /etc/s6-overlay/s6-rc.d/user/contents.d/testagent + +ENTRYPOINT ["/usr/local/bin/zonemaster_launch"] diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index 22078968..6e9a2c3c 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -5,6 +5,8 @@ ^.*\.log ^.*\.swp$ ^MANIFEST\.SKIP$ +^Dockerfile$ +^zonemaster_launch$ ^\.github/ ^docs/internal-documentation/ \.po$ diff --git a/Makefile.PL b/Makefile.PL index 4351f81e..b1237154 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -76,7 +76,20 @@ sub MY::postamble { $text = 'pure_all :: share/Makefile' . "\n" . "\t" . 'cd share && $(MAKE) all' . "\n"; }; - return $text; + my $docker = <<'END_DOCKER'; + +docker-build: + docker build --tag zonemaster/backend:local --build-arg version=$(VERSION) . + +docker-tag-version: + docker tag zonemaster/backend:local zonemaster/backend:$(VERSION) + +docker-tag-latest: + docker tag zonemaster/backend:local zonemaster/backend:latest + +END_DOCKER + + return $text . $docker; }; install_share; diff --git a/zonemaster_launch b/zonemaster_launch new file mode 100755 index 00000000..0d62eb42 --- /dev/null +++ b/zonemaster_launch @@ -0,0 +1,44 @@ +#!/bin/sh + + +case $1 in + + cli) + shift 1 + zonemaster-cli $@ + ;; + + zmb) + shift 1 + zmb $@ + ;; + + zmtest) + shift 1 + zmtest $@ + ;; + + rpcapi) + /usr/local/bin/starman --listen=0.0.0.0:5000 --preload-app --user=zonemaster --group=zonemaster /usr/local/bin/zonemaster_backend_rpcapi.psgi + + ;; + + testagent) + /usr/local/bin/zonemaster_backend_testagent -user=zonemaster --group=zonemaster foreground + ;; + + full) + exec /init + ;; + *) + echo "'$1' is not a valid option. + Available options: + - cli : pass argument to zonemaster-cli then quit + - full : start both rpcapi & testagent + - rpcapi + - testagent + - zmb + - zmtest + " + ;; +esac;