diff --git a/Dockerfile b/Dockerfile deleted file mode 120000 index 0fc2233..0000000 --- a/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -Dockerfile.amd64 \ No newline at end of file diff --git a/Dockerfile.amd64 b/Dockerfile.amd64 deleted file mode 100644 index 409db20..0000000 --- a/Dockerfile.amd64 +++ /dev/null @@ -1,96 +0,0 @@ -################################################################################ -# base system -################################################################################ -ARG image=ubuntu:18.04 -FROM $image as system - -ARG localbuild -RUN echo "LOCALBUILD=$localbuild" -RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; fi - -# built-in packages -RUN apt-get update \ - && apt-get install -y --no-install-recommends software-properties-common curl apache2-utils \ - && apt-get update \ - && add-apt-repository -y ppa:fcwu-tw/apps \ - && apt-get install -y --no-install-recommends --allow-unauthenticated \ - supervisor nginx sudo vim-tiny net-tools zenity xz-utils \ - dbus-x11 x11-utils alsa-utils \ - mesa-utils libgl1-mesa-dri \ - lxde xvfb x11vnc=0.9.16-1 \ - gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine arc-theme \ - firefox chromium-browser \ - ttf-ubuntu-font-family ttf-wqy-zenhei \ - && add-apt-repository -r ppa:fcwu-tw/apps \ - && apt-get autoclean \ - && apt-get autoremove \ - && rm -rf /var/lib/apt/lists/* -# Additional packages require ~600MB -# libreoffice pinta language-pack-zh-hant language-pack-gnome-zh-hant firefox-locale-zh-hant libreoffice-l10n-zh-tw - -# tini for subreap -ARG TINI_VERSION=v0.18.0 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /bin/tini -RUN chmod +x /bin/tini - -# ffmpeg -RUN mkdir -p /usr/local/ffmpeg \ - && curl -sSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz | tar xJvf - -C /usr/local/ffmpeg/ --strip 1 - -# python library -COPY image/usr/local/lib/web/backend/requirements.txt /tmp/ -RUN apt-get update \ - && dpkg-query -W -f='${Package}\n' > /tmp/a.txt \ - && apt-get install -y python-pip python-dev build-essential \ - && pip install setuptools wheel && pip install -r /tmp/requirements.txt \ - && dpkg-query -W -f='${Package}\n' > /tmp/b.txt \ - && apt-get remove -y `diff --changed-group-format='%>' --unchanged-group-format='' /tmp/a.txt /tmp/b.txt | xargs` \ - && apt-get autoclean -y \ - && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /var/cache/apt/* /tmp/a.txt /tmp/b.txt - - -################################################################################ -# builder -################################################################################ -FROM ubuntu:16.04 as builder - -ARG localbuild -RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; fi - -RUN apt-get update \ - && apt-get install -y --no-install-recommends curl ca-certificates - -# nodejs -RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - \ - && apt-get install -y nodejs - -# yarn -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt-get update \ - && apt-get install -y yarn - -# build frontend -COPY web /src/web -RUN cd /src/web \ - && yarn \ - && npm run build - - -################################################################################ -# merge -################################################################################ -FROM system -LABEL maintainer="fcwu.tw@gmail.com" - -COPY --from=builder /src/web/dist/ /usr/local/lib/web/frontend/ -COPY image / - -EXPOSE 80 -WORKDIR /root -ENV HOME=/home/ubuntu \ - SHELL=/bin/bash -HEALTHCHECK --interval=30s --timeout=5s CMD curl --fail http://127.0.0.1:6079/api/health -ENTRYPOINT ["/startup.sh"] diff --git a/Dockerfile.armhf b/Dockerfile.j2 similarity index 74% rename from Dockerfile.armhf rename to Dockerfile.j2 index 92e2b20..5ffe870 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.j2 @@ -1,21 +1,30 @@ -FROM ubuntu:18.04 as amd64 -RUN apt update && apt install -y qemu-user-static - +# Built with arch: {{ arch }} flavor: {{ flavor }} image: {{ image }} +# ################################################################################ # base system ################################################################################ -FROM arm32v7/ubuntu:18.04 as system - +{%if arch == "amd64"%} +FROM {{image}} as system +{%elif arch == "armhf"%} +# qemu helper for arm build +FROM {{image}} as amd64 +RUN apt update && apt install -y qemu-user-static +FROM arm32v7/{{image}} as system COPY --from=amd64 /usr/bin/qemu-arm-static /usr/bin/ -ARG localbuild -RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; fi +{%endif%} +{% if localbuild %} +RUN echo "*** LOCAL BUILD ***" +RUN sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; +{% endif %} + +# built-in packages ENV DEBIAN_FRONTEND noninteractive RUN apt update \ && apt install -y --no-install-recommends software-properties-common curl apache2-utils \ && apt update \ && apt install -y --no-install-recommends --allow-unauthenticated \ - supervisor nginx sudo vim-tiny net-tools zenity xz-utils \ + supervisor nginx sudo net-tools zenity xz-utils \ dbus-x11 x11-utils alsa-utils \ mesa-utils libgl1-mesa-dri \ && apt autoclean -y \ @@ -25,30 +34,31 @@ RUN apt update \ RUN add-apt-repository -y ppa:fcwu-tw/apps \ && apt update \ && apt install -y --no-install-recommends --allow-unauthenticated \ - lxde xvfb x11vnc=0.9.16-1 \ - firefox chromium-browser \ - ttf-ubuntu-font-family ttf-wqy-zenhei \ + xvfb x11vnc=0.9.16-1 \ + {%for package in addon_packages%}{{package}} {%endfor%} \ && add-apt-repository -r ppa:fcwu-tw/apps \ && apt autoclean -y \ && apt autoremove -y \ && rm -rf /var/lib/apt/lists/* +{%if desktop == "lxde" %} RUN apt update \ && apt install -y --no-install-recommends --allow-unauthenticated \ - gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine arc-theme \ + lxde gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine arc-theme \ && apt autoclean -y \ && apt autoremove -y \ && rm -rf /var/lib/apt/lists/* +{%endif%} # Additional packages require ~600MB # libreoffice pinta language-pack-zh-hant language-pack-gnome-zh-hant firefox-locale-zh-hant libreoffice-l10n-zh-tw -# tini for subreap +# tini for subreap ARG TINI_VERSION=v0.18.0 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-armhf /bin/tini +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /bin/tini RUN chmod +x /bin/tini # ffmpeg -#RUN mkdir -p /usr/local/ffmpeg \ -# && curl -sSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar xJvf - -C /usr/local/ffmpeg/ --strip 1 +RUN mkdir -p /usr/local/ffmpeg \ + && curl -sSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz | tar xJvf - -C /usr/local/ffmpeg/ --strip 1 # python library COPY image/usr/local/lib/web/backend/requirements.txt /tmp/ @@ -67,10 +77,11 @@ RUN apt-get update \ ################################################################################ # builder ################################################################################ -FROM ubuntu:18.04 as builder +FROM {{image}} as builder -ARG localbuild -RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; fi +{% if localbuild %} +RUN sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list; +{% endif %} RUN apt-get update \ && apt-get install -y --no-install-recommends curl ca-certificates gnupg patch @@ -90,8 +101,10 @@ COPY web /src/web RUN cd /src/web \ && yarn \ && npm run build -RUN cd /src/web/dist/static/novnc && patch -p0 < /src/web/novnc-armhf-1.patch +{%if arch == "armhf"%} +RUN cd /src/web/dist/static/novnc && patch -p0 < /src/web/novnc-armhf-1.patch +{%endif%} ################################################################################ # merge @@ -106,5 +119,5 @@ EXPOSE 80 WORKDIR /root ENV HOME=/home/ubuntu \ SHELL=/bin/bash -HEALTHCHECK --interval=30s --timeout=5s CMD curl --fail http://127.0.0.1/api/health +HEALTHCHECK --interval=30s --timeout=5s CMD curl --fail http://127.0.0.1:6079/api/health ENTRYPOINT ["/startup.sh"] diff --git a/Makefile b/Makefile index 6d07a07..382fca5 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,13 @@ REPO ?= dorowu/ubuntu-desktop-lxde-vnc TAG ?= latest IMAGE ?= ubuntu:18.04 LOCALBUILD ?= 1 +FLAVOR ?= default +ARCH ?= amd64 -build: - docker build -t $(REPO):$(TAG) --build-arg localbuild=$(LOCALBUILD) --build-arg image=$(IMAGE) . +templates = Dockerfile image/etc/supervisor/conf.d/supervisord.conf + +build: $(templates) + docker build -t $(REPO):$(TAG) . run: docker run --rm \ @@ -27,3 +31,16 @@ gen-ssl: mkdir -p ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ssl/nginx.key -out ssl/nginx.crt + +clean: + rm -f $(templates) + +% : %.j2 flavors/$(FLAVOR).yml + docker run -v $(shell pwd):/data vikingco/jinja2cli \ + -D flavor=$(FLAVOR) \ + -D repo=$(REPO) \ + -D tag=$(TAG) \ + -D image=$(IMAGE) \ + -D localbuild=$(LOCALBUILD) \ + -D arch=$(ARCH) \ + $< flavors/$(FLAVOR).yml > $@ || rm $@ diff --git a/flavors/default.yml b/flavors/default.yml new file mode 100644 index 0000000..be9438b --- /dev/null +++ b/flavors/default.yml @@ -0,0 +1,8 @@ +--- +addon_packages: + - vim-tiny + - firefox + - chromium-browser + - ttf-ubuntu-font-family + - ttf-wqy-zenhei +desktop: lxde diff --git a/image/etc/supervisor/conf.d/supervisord.conf b/image/etc/supervisor/conf.d/supervisord.conf.j2 similarity index 96% rename from image/etc/supervisor/conf.d/supervisord.conf rename to image/etc/supervisor/conf.d/supervisord.conf.j2 index 27690e9..49bcf17 100644 --- a/image/etc/supervisor/conf.d/supervisord.conf +++ b/image/etc/supervisor/conf.d/supervisord.conf.j2 @@ -17,14 +17,10 @@ stdout_logfile_maxbytes=0 stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 +{% if desktop == "lxde" %} [group:x] programs=xvfb,wm,lxpanel,pcmanfm,x11vnc,novnc -[program:xvfb] -priority=10 -command=/usr/local/bin/xvfb.sh -stopsignal=KILL - [program:wm] priority=15 command=/usr/bin/openbox @@ -43,6 +39,12 @@ directory=%HOME% command=/usr/bin/pcmanfm --desktop --profile LXDE user=%USER% environment=DISPLAY=":1",HOME="%HOME%",USER="%USER%" +{% endif %} + +[program:xvfb] +priority=10 +command=/usr/local/bin/xvfb.sh +stopsignal=KILL [program:x11vnc] priority=20