
electron-builder构建镜像
coding十二月 09, 20201mins
Electron
electron-builder构建依赖很多工具,使用一些阉割过的镜像作为runner进行构建会报各种错误
例如,错误一
bash
cannot execute cause=fork/exec /builds/operation-esci-ergom/electric-ergo/electron-src/node_modules/7zip-bin/linux/x64/7za: no such file or directory
实际文件是存在的,二进制文件也没有任何问题,ENOENT错误,不仅仅意味着文件存在或者权限不足,也可能是参数错误,动态库缺失。
通过 ldd 命令可以列出动态库依赖关系
bash
ldd /example/node_modules/7zip-bin/linux/x64/7za
会输出结果
bash
/lib64/ld-linux-x86-64.so.2 (0x7febe540e000)libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7febe540e000)libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7febe52b9000)libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7febe540e000)libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7febe52a5000)libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7febe540e000)
错误二
bash
⨯ cannot execute cause=exit status 1out={:timestamp=>"2020-06-19T01:21:24.878818+0000", :message=>"Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag", :level=>:warn}{:timestamp=>"2020-06-19T01:24:39.285106+0000", :message=>"Need executable 'ar' to convert dir to deb", :level=>:error}
缺失ar导致的
看到官方似乎有构建镜像electronuserland/electron-builder,但是又缺少JDK环境。
bash
FROM buildpack-deps:zesty-curl# rpm is required for FPM to build rpm package# yasm is required to build p7zip# install modern multi-thread xz# ldconfig - see 4.6. liblzma.so (or similar) not found when running xz# python for node-gyp# libsecret-1-0 for keytar……
因此只能自己构建一个镜像了
构建镜像H1
官方的amd64/openjdk镜像和electronuserland/electron-builder都是基于buildpack-deps来构建的。
electron-builder Dockerfile
bash
FROM buildpack-deps:zesty-curl# rpm is required for FPM to build rpm package# yasm is required to build p7zip# install modern multi-thread xz# ldconfig - see 4.6. liblzma.so (or similar) not found when running xz# python for node-gyp# libsecret-1-0 for keytarENV XZ_VERSION 5.2.3# we don't use our bundled 7za because it is better to build for specific platform - not genericENV USE_SYSTEM_7ZA trueENV USE_SYSTEM_XORRISO trueENV DEBUG_COLORS trueENV FORCE_COLOR trueENV DEBIAN_FRONTEND noninteractive# locales for locale-genRUN curl -L https://yarnpkg.com/latest.tar.gz | tar xvz && mv yarn-* /yarn && \apt-get update -y && apt-get install --no-install-recommends -y software-properties-common && \wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \add-apt-repository ppa:snappy-dev/tools && apt-get update -y && apt-get upgrade -y && \apt-get install --no-install-recommends -y google-chrome-stable libsecret-1-0 locales xvfb git snapcraft qtbase5-dev xorriso bsdtar build-essential autoconf libssl-dev icnsutils libopenjp2-7 graphicsmagick gcc-multilib g++-multilib libgnome-keyring-dev lzip rpm yasm python libcurl3 git ssh && \curl -O http://mirrors.kernel.org/ubuntu/pool/universe/libi/libicns/libicns1_0.8.1-3.1_amd64.deb && dpkg --install libicns1_0.8.1-3.1_amd64.deb && unlink libicns1_0.8.1-3.1_amd64.deb && \apt-get remove software-properties-common -y && \apt-get clean && rm -rf /var/lib/apt/lists/* && \curl -L http://tukaani.org/xz/xz-$XZ_VERSION.tar.xz | tar -xJ && cd xz-$XZ_VERSION && ./configure && make && make install && cd .. && rm -rf xz-$XZ_VERSION && ldconfig && \mkdir -p /tmp/7z && curl -L http://downloads.sourceforge.net/project/p7zip/p7zip/16.02/p7zip_16.02_src_all.tar.bz2 | tar -xj -C /tmp/7z --strip-components 1 && cd /tmp/7z && cp makefile.linux_amd64_asm makefile.machine && make && make install && rm -rf /tmp/7zCOPY test.sh /test.shWORKDIR /project# fix error /usr/local/bundle/gems/fpm-1.5.0/lib/fpm/package/freebsd.rb:72:in `encode': "\xE2" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)# http://jaredmarkell.com/docker-and-locales/# http://askubuntu.com/a/601498RUN locale-gen en_US.UTF-8ENV LANG en_US.UTF-8ENV LANGUAGE en_US:enENV LC_ALL en_US.UTF-8ENV PATH "/yarn/bin:$PATH"
更新H1
electronuserland/electron-builder被废弃,应该使用
electronuserland/builder作为基础镜像,构建Java 11
bash
FROM buildpack-deps:buster-scmRUN set -eux; \apt-get update; \apt-get install -y --no-install-recommends \bzip2 \unzip \xz-utils \\# utilities for keeping Debian and OpenJDK CA certificates in syncca-certificates p11-kit \\# java.lang.UnsatisfiedLinkError: /usr/local/openjdk-11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory# java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager# https://github.com/docker-library/openjdk/pull/235#issuecomment-424466077fontconfig libfreetype6 \; \rm -rf /var/lib/apt/lists/*# Default to UTF-8 file.encodingENV LANG C.UTF-8ENV JAVA_HOME /usr/local/openjdk-11ENV PATH $JAVA_HOME/bin:$PATH# backwards compatibility shimRUN { echo '#/bin/sh'; echo 'echo "$JAVA_HOME"'; } > /usr/local/bin/docker-java-home && chmod +x /usr/local/bin/docker-java-home && [ "$JAVA_HOME" = "$(docker-java-home)" ]# https://adoptopenjdk.net/upstream.html# ># > What are these binaries?# ># > These binaries are built by Red Hat on their infrastructure on behalf of the OpenJDK jdk8u and jdk11u projects. The binaries are created from the unmodified source code at OpenJDK. Although no formal support agreement is provided, please report any bugs you may find to https://bugs.java.com/.# >ENV JAVA_VERSION 11.0.7ENV JAVA_BASE_URL https://github.com/AdoptOpenJDK/openjdk11-upstream-binaries/releases/download/jdk-11.0.7%2B10/OpenJDK11U-jdk_ENV JAVA_URL_VERSION 11.0.7_10# https://github.com/docker-library/openjdk/issues/320#issuecomment-494050246# ># > I am the OpenJDK 8 and 11 Updates OpenJDK project lead.# > ...# > While it is true that the OpenJDK Governing Board has not sanctioned those releases, they (or rather we, since I am a member) didn't sanction Oracle's OpenJDK releases either. As far as I am aware, the lead of an OpenJDK project is entitled to release binary builds, and there is clearly a need for them.# >RUN set -eux; \\dpkgArch="$(dpkg --print-architecture)"; \case "$dpkgArch" in \amd64) upstreamArch='x64' ;; \arm64) upstreamArch='aarch64' ;; \*) echo >&2 "error: unsupported architecture: $dpkgArch" ;; \esac; \\wget -O openjdk.tgz.asc "${JAVA_BASE_URL}${upstreamArch}_linux_${JAVA_URL_VERSION}.tar.gz.sign"; \wget -O openjdk.tgz "${JAVA_BASE_URL}${upstreamArch}_linux_${JAVA_URL_VERSION}.tar.gz" --progress=dot:giga; \\export GNUPGHOME="$(mktemp -d)"; \# TODO find a good link for users to verify this key is right (https://mail.openjdk.java.net/pipermail/jdk-updates-dev/2019-April/000951.html is one of the only mentions of it I can find); perhaps a note added to https://adoptopenjdk.net/upstream.html would make sense?# no-self-sigs-only: https://salsa.debian.org/debian/gnupg2/commit/c93ca04a53569916308b369c8b218dad5ae8fe07gpg --batch --keyserver ha.pool.sks-keyservers.net --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; \# also verify that key was signed by Andrew Haley (the OpenJDK 8 and 11 Updates OpenJDK project lead)# (https://github.com/docker-library/openjdk/pull/322#discussion_r286839190)gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; \gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F \| tee /dev/stderr \| grep '0xA5CD6035332FA671' \| grep 'Andrew Haley'; \gpg --batch --verify openjdk.tgz.asc openjdk.tgz; \gpgconf --kill all; \rm -rf "$GNUPGHOME"; \\mkdir -p "$JAVA_HOME"; \tar --extract \--file openjdk.tgz \--directory "$JAVA_HOME" \--strip-components 1 \--no-same-owner \; \rm openjdk.tgz*; \\# TODO strip "demo" and "man" folders?\# update "cacerts" bundle to use Debian's CA certificates (and make sure it stays up-to-date with changes to Debian's store)# see https://github.com/docker-library/openjdk/issues/327# http://rabexc.org/posts/certificates-not-working-java#comment-4099504075# https://salsa.debian.org/java-team/ca-certificates-java/blob/3e51a84e9104823319abeb31f880580e46f45a98/debian/jks-keystore.hook.in# https://git.alpinelinux.org/aports/tree/community/java-cacerts/APKBUILD?id=761af65f38b4570093461e6546dcf6b179d2b624#n29{ \echo '#!/usr/bin/env bash'; \echo 'set -Eeuo pipefail'; \echo 'if ! [ -d "$JAVA_HOME" ]; then echo >&2 "error: missing JAVA_HOME environment variable"; exit 1; fi'; \# 8-jdk uses "$JAVA_HOME/jre/lib/security/cacerts" and 8-jre and 11+ uses "$JAVA_HOME/lib/security/cacerts" directly (no "jre" directory)echo 'cacertsFile=; for f in "$JAVA_HOME/lib/security/cacerts" "$JAVA_HOME/jre/lib/security/cacerts"; do if [ -e "$f" ]; then cacertsFile="$f"; break; fi; done'; \echo 'if [ -z "$cacertsFile" ] || ! [ -f "$cacertsFile" ]; then echo >&2 "error: failed to find cacerts file in $JAVA_HOME"; exit 1; fi'; \echo 'trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose=server-auth "$cacertsFile"'; \} > /etc/ca-certificates/update.d/docker-openjdk; \chmod +x /etc/ca-certificates/update.d/docker-openjdk; \/etc/ca-certificates/update.d/docker-openjdk; \\# https://github.com/docker-library/openjdk/issues/331#issuecomment-498834472find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; \ldconfig; \\# basic smoke testjavac --version; \java --version# "jshell" is an interactive REPL for Java (see https://en.wikipedia.org/wiki/JShell)CMD ["jshell"]
评论
新的评论
上一篇
Jest Getting Started
概述 对于测试,我们一般需要 测试框架 定义测试,调用测试方法,报告测试结果等,比如mocha、chai 启动器 启动测试环境,并在测试环境中运行测试框架,比如karma 断言库 对测试结果进行断言,一般测试框架会自带基础的断言 mock库 单元测试需要对mock来模拟外部…
下一篇
Spring Boot Testing
检测Test Configuration 不像Spring Framework使用的 @ContextConfiguration 来声明主要的Configuration,Spring Boot的 @*Test 注解,如果没有明确定义主要的Configuration的话会自动…
