内容简介:上篇介绍了 alinode 自定义封装,但毕竟不是官网原配置,群里也有人吐槽过官网镜像太大。所以这次分析官网镜像,看看到底为什么这么多大,顺便提取官网 Dockerfile。目前有
上篇介绍了 alinode 自定义封装,但毕竟不是官网原配置,群里也有人吐槽过官网镜像太大。
所以这次分析官网镜像,看看到底为什么这么多大,顺便提取官网 Dockerfile。
官网镜像介绍
目前有 3
和 3-alpine
两种版本。
3
镜像 732MB,为什么这么大?
3-alpine
我提 issue 后正常了,仅仅 71.5MB。
其实无关大小,大家用镜像,无非图个省事,但没有 Dockerfile 用的人也很慌。
上一篇也提到了,官网有个一年多没更新过的 Dockerfile,其实也能用。
我们还是来着重分析下 3
版本,看看为什么这么大。
docker image 分析
逆向分析镜像有两种方法。
一种是 docker history
可以看到每一层的配置,但包括了从底层镜像开始的所有配置,所以会很杂乱。
另一种是 docker save
导出 tar 包,解压后,不仅可以得到每一层的配置,还能详细的看到每一层的文件增删情况。
这里我们讨论 docker history
方法,因为够用了。
docker history
$ docker history --no-trunc registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 > history.md
这里加了 --no-trunc
参数,不截断数据,并且导出到 history.md
文件中。
ps: 由于 --no-trunc
的结果太长,不合适博客展示,所以这里贴了下截断后的数据。
IMAGE CREATED CREATED BY SIZE COMMENT e649e72af9a2 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/start-agent… 0B <missing> 2 weeks ago /bin/sh -c #(nop) COPY file:cdecc22ff2ae3835… 178B <missing> 2 weeks ago /bin/sh -c #(nop) COPY file:2446f9972d7e6dfa… 885B <missing> 2 weeks ago /bin/sh -c ENABLE_NODE_LOG=NO npm install -g… 8.18MB <missing> 2 weeks ago /bin/sh -c curl -SLO "http://alinode.aliyun.… 54.2MB <missing> 2 weeks ago /bin/sh -c #(nop) ENV HOME=/root 0B <missing> 2 weeks ago /bin/sh -c #(nop) ENV NODE_LOG_DIR=/tmp 0B <missing> 2 weeks ago /bin/sh -c #(nop) ENV ENABLE_NODE_LOG=YES 0B <missing> 2 weeks ago /bin/sh -c #(nop) ENV ALINODE_VERSION=3.12.0 0B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["node"] 0B <missing> 3 weeks ago /bin/sh -c set -ex && for key in 6A010… 4.5MB <missing> 3 weeks ago /bin/sh -c #(nop) ENV YARN_VERSION=1.9.4 0B <missing> 3 weeks ago /bin/sh -c ARCH= && dpkgArch="$(dpkg --print… 53.8MB <missing> 3 weeks ago /bin/sh -c #(nop) ENV NODE_VERSION=8.12.0 0B <missing> 4 weeks ago /bin/sh -c set -ex && for key in 94AE3… 137kB <missing> 4 weeks ago /bin/sh -c groupadd --gid 1000 node && use… 335kB <missing> 4 weeks ago /bin/sh -c set -ex; apt-get update; apt-ge… 320MB <missing> 4 weeks ago /bin/sh -c apt-get update && apt-get install… 123MB <missing> 4 weeks ago /bin/sh -c set -ex; if ! command -v gpg > /… 0B <missing> 4 weeks ago /bin/sh -c apt-get update && apt-get install… 41.1MB <missing> 4 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:8d73a09e59fe50289… 127MB
IMAGE
这列,全部丢失,只有最后一层有个 id。
CREATED BY
是我们关注的主体,其他列都可以忽略。
当然你也可以看看 SIZE
太大的层可以去优化下命令。
在 CREATED BY
列中,全部是 /bin/sh -c
开头,但有的有 #(nop)
有的没有,这是为什么?
我也不知道,但仔细观察,其实可以发现没 #(nop)
是 RUN
指令的配置。
那么简单了,所有 /bin/sh -c #(nop)
删除,剩下的所有 /bin/sh -c
改成 RUN
就是我们要的 dockerfile 配置了。
再观察下发现好像最下面的是底层镜像配置,所以应该将结果倒序下才是我们要的 dockerfile。
这里写了个 bash 来辅助我们输出结果
docker history \ --no-trunc \ --format "{{.CreatedBy}}" \ # 只输出 CREATED BY 字段 registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 \ | perl -e 'print reverse <>' \ # 倒序 | sed 's/\/bin\/sh -c #(nop) //' # 删除 #(nop) | sed 's/\/bin\/sh -c /RUN /' \ # 替换 RUN 指令 > dockerfile
保存为 history.sh
执行 sh history.sh
得到 dockerfile 文件,内容如下。
ADD file:8d73a09e59fe50289a6d0c019302aefe2e00ac6411e82404389c0c83f50cf08a in / CMD ["bash"] RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl netbase wget && rm -rf /var/lib/apt/lists/* RUN set -ex; if ! command -v gpg > /dev/null; then apt-get update; apt-get install -y --no-install-recommends gnupg dirmngr ; rm -rf /var/lib/apt/lists/*; fi RUN apt-get update && apt-get install -y --no-install-recommends bzr git mercurial openssh-client subversion procps && rm -rf /var/lib/apt/lists/* RUN set -ex; apt-get update; apt-get install -y --no-install-recommends autoconf automake bzip2 dpkg-dev file g++ gcc imagemagick libbz2-dev libc6-dev libcurl4-openssl-dev libdb-dev libevent-dev libffi-dev libgdbm-dev libgeoip-dev libglib2.0-dev libjpeg-dev libkrb5-dev liblzma-dev libmagickcore-dev libmagickwand-dev libncurses5-dev libncursesw5-dev libpng-dev libpq-dev libreadline-dev libsqlite3-dev libssl-dev libtool libwebp-dev libxml2-dev libxslt-dev libyaml-dev make patch xz-utils zlib1g-dev $( if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then echo 'default-libmysqlclient-dev'; else echo 'libmysqlclient-dev'; fi ) ; rm -rf /var/lib/apt/lists/* RUN groupadd --gid 1000 node && useradd --uid 1000 --gid node --shell /bin/bash --create-home node RUN set -ex && for key in 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 FD3A5288F042B6850C66B31F09FE44734EB7990E 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 DD8F2338BAE7501E3DD5AC78C273792F7D83545D C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 B9AE9905FFD7803F25714661B63B535A4C206CA9 56730D5401028683275BD23C23EFEFE93C4CFFFE 77984A986EBC2AA786BC0F66B01FBB92821C587A 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 ; do gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; done ENV NODE_VERSION=8.12.0 RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" && case "${dpkgArch##*-}" in amd64) ARCH='x64';; ppc64el) ARCH='ppc64le';; s390x) ARCH='s390x';; arm64) ARCH='arm64';; armhf) ARCH='armv7l';; i386) ARCH='x86';; *) echo "unsupported architecture"; exit 1 ;; esac && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt && ln -s /usr/local/bin/node /usr/local/bin/nodejs ENV YARN_VERSION=1.9.4 RUN set -ex && for key in 6A010C5166006599AA17F08146C2130DFD2497F5 ; do gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; done && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz && mkdir -p /opt && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz CMD ["node"] ENV ALINODE_VERSION=3.12.0 ENV ENABLE_NODE_LOG=YES ENV NODE_LOG_DIR=/tmp ENV HOME=/root RUN curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/alinode-v$ALINODE_VERSION-linux-x64.tar.gz" && curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/SHASUMS256.txt" && grep " alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt | sha256sum -c - && tar -zxvf "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner && rm "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt RUN ENABLE_NODE_LOG=NO npm install -g @alicloud/agenthub --registry=https://registry.npm.taobao.org COPY file:2446f9972d7e6dfaebacf7c2defe4a0425a23e4cf98ca598f61840e9f4fe1d67 in /root COPY file:cdecc22ff2ae3835fb36e08a92aa71e8857bc4048dccdae1b6bad0061de3b32f in / ENTRYPOINT ["/start-agenthub.sh"]
虽然还是有点乱,但至少得到了所有配置,接下来我们分析这些配置。
分析 history 提取最终 Dockerfile
这里先使用下我写的一个工具,重新得到格式化后的 dockerfile,方便我们分析,这个 工具 下一篇文章详细介绍。
$ npx dockerfile-from-image registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 > dockerfile
PS: 不知道 npx 是什么或者 npx 命令无效的同学,请自行百度,这是神器,必须掌握。
得到如下 dockerfile 配置。
FROM registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 ADD file:8d73a09e59fe50289a6d0c019302aefe2e00ac6411e82404389c0c83f50cf08a in / CMD ["bash"] RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ netbase \ wget \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ if ! command -v gpg > /dev/null; then \ apt-get update; \ apt-get install -y --no-install-recommends \ gnupg \ dirmngr \ ; \ rm -rf /var/lib/apt/lists/*; \ fi RUN apt-get update && apt-get install -y --no-install-recommends \ bzr \ git \ mercurial \ openssh-client \ subversion \ procps \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends \ autoconf \ automake \ bzip2 \ dpkg-dev \ file \ g++ \ gcc \ imagemagick \ libbz2-dev \ libc6-dev \ libcurl4-openssl-dev \ libdb-dev \ libevent-dev \ libffi-dev \ libgdbm-dev \ libgeoip-dev \ libglib2.0-dev \ libjpeg-dev \ libkrb5-dev \ liblzma-dev \ libmagickcore-dev \ libmagickwand-dev \ libncurses5-dev \ libncursesw5-dev \ libpng-dev \ libpq-dev \ libreadline-dev \ libsqlite3-dev \ libssl-dev \ libtool \ libwebp-dev \ libxml2-dev \ libxslt-dev \ libyaml-dev \ make \ patch \ xz-utils \ zlib1g-dev \ $( \ if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then \ echo 'default-libmysqlclient-dev'; \ else \ echo 'libmysqlclient-dev'; \ fi \ ) \ ; \ rm -rf /var/lib/apt/lists/* RUN groupadd --gid 1000 node \ && useradd --uid 1000 --gid node --shell /bin/bash --create-home node RUN set -ex \ && for key in \ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ FD3A5288F042B6850C66B31F09FE44734EB7990E \ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ B9AE9905FFD7803F25714661B63B535A4C206CA9 \ 56730D5401028683275BD23C23EFEFE93C4CFFFE \ 77984A986EBC2AA786BC0F66B01FBB92821C587A \ 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ ; do \ gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ done ENV NODE_VERSION=8.12.0 RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ && case "${dpkgArch##*-}" in \ amd64) ARCH='x64';; \ ppc64el) ARCH='ppc64le';; \ s390x) ARCH='s390x';; \ arm64) ARCH='arm64';; \ armhf) ARCH='armv7l';; \ i386) ARCH='x86';; \ *) echo "unsupported architecture"; exit 1 ;; \ esac \ && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs ENV YARN_VERSION=1.9.4 RUN set -ex \ && for key in \ 6A010C5166006599AA17F08146C2130DFD2497F5 \ ; do \ gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ done \ && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ && mkdir -p /opt \ && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz CMD ["node"] ENV ALINODE_VERSION=3.12.0 ENV ENABLE_NODE_LOG=YES ENV NODE_LOG_DIR=/tmp ENV HOME=/root RUN curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/alinode-v$ALINODE_VERSION-linux-x64.tar.gz" \ && curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/SHASUMS256.txt" \ && grep " alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt | sha256sum -c - \ && tar -zxvf "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt RUN ENABLE_NODE_LOG=NO npm install -g @alicloud/agenthub --registry=https://registry.npm.taobao.org COPY file:2446f9972d7e6dfaebacf7c2defe4a0425a23e4cf98ca598f61840e9f4fe1d67 in /root COPY file:cdecc22ff2ae3835fb36e08a92aa71e8857bc4048dccdae1b6bad0061de3b32f in / ENTRYPOINT ["/start-agenthub.sh"]
这样看就非常清晰了。
开头的 ADD file:xxx in /
和 CMD ["bash"]
明显就是基础镜像,接着往下看。
接下来各种 RUN
安装一大堆开发工具。。
直到 RUN groupadd --gid 1000 node \
才是我们熟悉的 node 环境相关的配置。
接着往下看,,一脸懵逼,怎么在安装官网 node ???不是说好的 alinode 么?
我们继续往下看,直到 ENV ALINODE_VERSION=3.12.0
才是我们 alinode 的配置。
下面不到10个指令,命令简洁明了,设置相关环境变量,然后从阿里云下载 alinode,解压到 /usr/local
目录。
然后是安装 agenthub 接着添加两个文件到 root目录 和 根目录。
其实是 default.config.js
复制到 /root
然后是 start-agenthub.sh
复制到 /
并作为 ENTRYPOINT
入口。
怎么提取这两个文件,下面详细说明,我们先整理 dockerfile。
从这里看,其实就是最后几条质量有用没其他都是些啥?
如果你对 node 镜像熟悉的话,其实不难发现,他是 node:8
的镜像。
$ npx dockerfile-from-image node:8 > dockerfile
得到
FROM node:8 ADD file:8d73a09e59fe50289a6d0c019302aefe2e00ac6411e82404389c0c83f50cf08a in / CMD ["bash"] RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ netbase \ wget \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ if ! command -v gpg > /dev/null; then \ apt-get update; \ apt-get install -y --no-install-recommends \ gnupg \ dirmngr \ ; \ rm -rf /var/lib/apt/lists/*; \ fi RUN apt-get update && apt-get install -y --no-install-recommends \ bzr \ git \ mercurial \ openssh-client \ subversion \ procps \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends \ autoconf \ automake \ bzip2 \ dpkg-dev \ file \ g++ \ gcc \ imagemagick \ libbz2-dev \ libc6-dev \ libcurl4-openssl-dev \ libdb-dev \ libevent-dev \ libffi-dev \ libgdbm-dev \ libgeoip-dev \ libglib2.0-dev \ libjpeg-dev \ libkrb5-dev \ liblzma-dev \ libmagickcore-dev \ libmagickwand-dev \ libncurses5-dev \ libncursesw5-dev \ libpng-dev \ libpq-dev \ libreadline-dev \ libsqlite3-dev \ libssl-dev \ libtool \ libwebp-dev \ libxml2-dev \ libxslt-dev \ libyaml-dev \ make \ patch \ xz-utils \ zlib1g-dev \ $( \ if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then \ echo 'default-libmysqlclient-dev'; \ else \ echo 'libmysqlclient-dev'; \ fi \ ) \ ; \ rm -rf /var/lib/apt/lists/* RUN groupadd --gid 1000 node \ && useradd --uid 1000 --gid node --shell /bin/bash --create-home node RUN set -ex \ && for key in \ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ FD3A5288F042B6850C66B31F09FE44734EB7990E \ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ B9AE9905FFD7803F25714661B63B535A4C206CA9 \ 56730D5401028683275BD23C23EFEFE93C4CFFFE \ 77984A986EBC2AA786BC0F66B01FBB92821C587A \ 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ ; do \ gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ done ENV NODE_VERSION=8.12.0 RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ && case "${dpkgArch##*-}" in \ amd64) ARCH='x64';; \ ppc64el) ARCH='ppc64le';; \ s390x) ARCH='s390x';; \ arm64) ARCH='arm64';; \ armhf) ARCH='armv7l';; \ i386) ARCH='x86';; \ *) echo "unsupported architecture"; exit 1 ;; \ esac \ && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs ENV YARN_VERSION=1.9.4 RUN set -ex \ && for key in \ 6A010C5166006599AA17F08146C2130DFD2497F5 \ ; do \ gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ done \ && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ && mkdir -p /opt \ && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz CMD ["node"]
是不是一毛一样?
所以最终的 Dockerfile 是这样的。
FROM node:8 ENV ALINODE_VERSION=3.12.0 ENV ENABLE_NODE_LOG=YES ENV NODE_LOG_DIR=/tmp ENV HOME=/root RUN curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/alinode-v$ALINODE_VERSION-linux-x64.tar.gz" \ && curl -SLO "http://alinode.aliyun.com/dist/new-alinode/v$ALINODE_VERSION/SHASUMS256.txt" \ && grep " alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt | sha256sum -c - \ && tar -zxvf "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "alinode-v$ALINODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt RUN ENABLE_NODE_LOG=NO npm install -g @alicloud/agenthub --registry=https://registry.npm.taobao.org COPY default.config.js /root COPY start-agenthub.sh / ENTRYPOINT ["/start-agenthub.sh"]
瞬间明朗了,也知道为什么镜像这么大了。
node:8 Dockerfile
镜像依赖 buildpack-deps:jessie
。
从刚才的配置也看到了,几乎包含了所有开发编译时所需的各种工具。
那么还有个问题, default.config.js
, start-agenthub.sh
怎么提取?
$ docker run --rm -it registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 cat /start-agenthub.sh > start-agenthub.sh $ docker run --rm -it registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode:3 cat /root/default.config.js > default.config.js
好了 Dockerfile
, default.config.js
, start-agenthub.sh
都得到了。
接着就可以 docker build -t alinode .
编译镜像了。
当然,你也可以为所欲为,各种魔改。
小结
我是一个喜欢刨根究底的人,这个事情其实上个月该做的,但各种琐事以及懒惰,拖到这个月才处理。
但结果是好的,把事情搞清楚了,以后遇到没有 Dockerfile 的镜像也可以分析出个大概。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。