Edited at

circleci/ruby:2.4.1-node-browsersって何入ってるのか知りたかった

2018-11-19追記

https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/

いつの間にか公開されてました


動機


  • circleciが提供しているdockerファイルで、rubyのバージョンとして、node, browswer , node-browsersとかがあった



    • setup-projectしたときのデフォルトはnode-browsersだった

    • 地味にsetup projectでボイラープレート出てくるのも知らなかった。。。



  • なんとなくフロント好きおじさんからするとnodeってバージョン何入ってるんだ!が気になった。


dockerの中身が見たい。

残念ながらDockerfileは公開されていないっぽい

https://discuss.circleci.com/t/official-ruby-dockerfile/12853/2

ここでdocker historyコマンドがあると知った。

$ docker pull circleci/ruby:2.4.1-node-browsers

$ docker history --no-trunc --format "{{.CreatedBy}}" circleci/ruby:2.4.1-node-browsers

今回はコマンド何やってるか知れれば良いだけなのでformatかける


circleci/ruby:2.4.1-node-browsersは何が入っているっぽいか荒目に見る

historyなので、実行が逆順。先頭の方が後に行っているコマンド


entrypoint

docker-entrypoint.shはssh接続したら見れそうだけど、今のところ興味ないのでスルー

#(nop)  CMD ["/bin/sh"]

#(nop) ENTRYPOINT ["/docker-entrypoint.sh"]
#(nop) LABEL com.circleci.preserve-entrypoint=true


browser関連インストール

怒号感ある。

printf '#!/bin/sh\nXvfb :99 -screen 0 1280x1024x24 &\nexec "$@"\n' > /tmp/entrypoint  && chmod +x /tmp/entrypoint         && sudo mv /tmp/entrypoint /docker-entrypoint.sh

#(nop) ENV DISPLAY=:99
export CHROMEDRIVER_RELEASE=$(curl --location --fail --retry 3 http://chromedriver.storage.googleapis.com/LATEST_RELEASE) && curl --silent --show-error --location --fail --retry 3 --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_RELEASE/chromedriver_linux64.zip" && cd /tmp && unzip chromedriver_linux64.zip && rm -rf chromedriver_linux64.zip && sudo mv chromedriver /usr/local/bin/chromedriver && sudo chmod +x /usr/local/bin/chromedriver
curl --silent --show-error --location --fail --retry 3 --output /tmp/google-chrome-stable_current_amd64.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && (sudo dpkg -i /tmp/google-chrome-stable_current_amd64.deb || sudo apt-get -fy install) && rm -rf /tmp/google-chrome-stable_current_amd64.deb && sudo sed -i 's|HERE/chrome"|HERE/chrome" --disable-setuid-sandbox --no-sandbox|g' "/opt/google/chrome/google-chrome"
curl --silent --show-error --location --fail --retry 3 --output /tmp/firefox.deb https://s3.amazonaws.com/circle-downloads/firefox-mozilla-build_47.0.1-0ubuntu1_amd64.deb && echo 'ef016febe5ec4eaf7d455a34579834bcde7703cb0818c80044f4d148df8473bb /tmp/firefox.deb' | sha256sum -c && sudo dpkg -i /tmp/firefox.deb || sudo apt-get -f install && sudo apt-get install -y libgtk3.0-cil-dev && rm -rf /tmp/firefox.deb
export PHANTOMJS_VERSION=$(curl --location --fail --retry 3 https://api.github.com/repos/ariya/phantomjs/tags | jq -r '.[0].name') && sudo apt-get update; sudo apt-get install libfontconfig && curl --silent --show-error --location --fail --retry 3 --output /tmp/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-${PHANTOMJS_VERSION}-linux-x86_64.tar.bz2 && tar -x -C /tmp -f /tmp/phantomjs.tar.bz2 && sudo mv /tmp/phantomjs-${PHANTOMJS_VERSION}-linux-x86_64/bin/phantomjs /usr/local/bin && rm -rf /tmp/phantomjs.tar.bz2 /tmp/phantomjs-*
#(nop) USER [circleci]

こんな感じが読み取れる


  • xvfbが入ってるっぽい

  • chromedriver入れてる

  • chrome入れてる

  • firefox入れてる

  • phantomjs入れてる


node & yarnインストール

set -ex   && for key in     6A010C5166006599AA17F08146C2130DFD2497F5   ; do     gpg --keyserver pgp.mit.edu --recv-keys "$key" ||     gpg --keyserver keyserver.pgp.com --recv-keys "$key" ||     gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ;   done   && curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz"   && curl -fSLO --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/yarn   && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/yarn --strip-components=1   && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn   && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarnpkg   && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz

#(nop) ENV YARN_VERSION=0.24.6
curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" && curl -SLO --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-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt && ln -s /usr/local/bin/node /usr/local/bin/nodejs
#(nop) ENV NODE_VERSION=8.1.4
#(nop) ENV NPM_CONFIG_LOGLEVEL=info


  • yarn入れてる

  • node入れてる


    • nodeが8.1ということも判明



なるほど。このへんまでで-node-browswerとわかった。わりと想像通り。


dockerなどツール系インストール

set -ex   && for key in     9554F04D7259F04124DE6B476D5A82AC7E37093B     94AE36675C464D64BAFA68DD7434390BDBE9B9C5     FD3A5288F042B6850C66B31F09FE44734EB7990E     71DCFD284A79C3B38668286BC97EC7A07EDE3FC1     DD8F2338BAE7501E3DD5AC78C273792F7D83545D     B9AE9905FFD7803F25714661B63B535A4C206CA9     C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8     56730D5401028683275BD23C23EFEFE93C4CFFFE   ; do     gpg --keyserver pgp.mit.edu --recv-keys "$key" ||     gpg --keyserver keyserver.pgp.com --recv-keys "$key" ||     gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ;   done

groupadd --gid 1000 node && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
#(nop) USER [root]
#(nop) CMD ["/bin/sh"]
#(nop) USER [circleci]
groupadd --gid 3434 circleci && useradd --uid 3434 --gid circleci --shell /bin/bash --create-home circleci && echo 'circleci ALL=NOPASSWD: ALL' >> /etc/sudoers.d/50-circleci && echo 'Defaults env_keep += "DEBIAN_FRONTEND"' >> /etc/sudoers.d/env_keep
DOCKERIZE_URL=$(curl --location --fail --retry 3 https://api.github.com/repos/jwilder/dockerize/releases/latest | jq -r '.assets[] | select(.name | startswith("dockerize-linux-amd64")) | .browser_download_url') && curl --silent --show-error --location --fail --retry 3 --output /tmp/dockerize-linux-amd64.tar.gz $DOCKERIZE_URL && tar -C /usr/local/bin -xzvf /tmp/dockerize-linux-amd64.tar.gz && rm -rf /tmp/dockerize-linux-amd64.tar.gz
COMPOSE_URL=$(curl --location --fail --retry 3 https://api.github.com/repos/docker/compose/releases/latest | jq -r '.assets[] | select(.name == "docker-compose-Linux-x86_64") | .browser_download_url') && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL && chmod +x /usr/bin/docker-compose
set -ex && export DOCKER_VERSION=$(curl --silent --fail --retry 3 https://get.docker.com/builds/ | grep -P -o 'docker-\d+\.\d+\.\d+-ce\.tgz' | head -n 1) && DOCKER_URL="https://get.docker.com/builds/Linux/x86_64/${DOCKER_VERSION}" && echo Docker URL: $DOCKER_URL && curl --silent --show-error --location --fail --retry 3 --output /tmp/docker.tgz "${DOCKER_URL}" && ls -lha /tmp/docker.tgz && tar -xz -C /tmp -f /tmp/docker.tgz && mv /tmp/docker/* /usr/bin && rm -rf /tmp/docker /tmp/docker.tgz
JQ_URL=$(curl --location --fail --retry 3 https://api.github.com/repos/stedolan/jq/releases/latest | grep browser_download_url | grep '/jq-linux64"' | grep -o -e 'https.*jq-linux64') && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/jq $JQ_URL && chmod +x /usr/bin/jq

docker関連とか色々瑣末なやつ入れている

* jq

* jsonパーサー

* dockerize

* https://github.com/jwilder/dockerize

* 専門知識が薄い部分なのでよくわかってないが、コンテナの起動関連?

* compose

* https://github.com/docker/compose/

* docker-compose。複数のdockerを扱うやつ


apt-get

gitやxvfbなどapt-getしてる

#(nop)  ENV LANG=C.UTF-8

locale-gen C.UTF-8 || true
ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
apt-get update && apt-get install -y git mercurial xvfb locales sudo openssh-client ca-certificates tar gzip parallel net-tools netcat unzip zip bzip2
#(nop) ENV DEBIAN_FRONTEND=noninteractive
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90circleci && echo 'APT::Get::force-Yes "true";' >> /etc/apt/apt.conf.d/90circleci && echo 'DPkg::Options "--force-confnew";' >> /etc/apt/apt.conf.d/90circleci


  • apt-getで色々入れてる


    • git / mercurial

    • xvfb

    • locales / sudo

    • openssh-client / ca-certificates

    • tar / gzip parallel

    • net-tools / netcat

    • unzip / zip / bzip2



  • このへんはdockerhubに書いてる感じ




rubyインストール

#(nop)  CMD ["irb"]

mkdir -p "$GEM_HOME" "$BUNDLE_BIN" && chmod 777 "$GEM_HOME" "$BUNDLE_BIN"
#(nop) ENV PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#(nop) ENV BUNDLE_PATH=/usr/local/bundle BUNDLE_BIN=/usr/local/bundle/bin BUNDLE_SILENCE_ROOT_WARNING=1 BUNDLE_APP_CONFIG=/usr/local/bundle
#(nop) ENV GEM_HOME=/usr/local/bundle
gem install bundler --version "$BUNDLER_VERSION"
#(nop) ENV BUNDLER_VERSION=1.15.1
set -ex && buildDeps=' bison dpkg-dev libgdbm-dev ruby ' && apt-get update && apt-get install -y --no-install-recommends $buildDeps && rm -rf /var/lib/apt/lists/* && wget -O ruby.tar.xz "https://cache.ruby-lang.org/pub/ruby/${RUBY_MAJOR%-rc}/ruby-$RUBY_VERSION.tar.xz" && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.xz" | sha256sum -c - && mkdir -p /usr/src/ruby && tar -xJf ruby.tar.xz -C /usr/src/ruby --strip-components=1 && rm ruby.tar.xz && cd /usr/src/ruby && { echo '#define ENABLE_PATH_CHECK 0'; echo; cat file.c; } > file.c.new && mv file.c.new file.c && autoconf && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" && ./configure --build="$gnuArch" --disable-install-doc --enable-shared && make -j "$(nproc)" && make install && apt-get purge -y --auto-remove $buildDeps && cd / && rm -r /usr/src/ruby && gem update --system "$RUBYGEMS_VERSION"
#(nop) ENV RUBYGEMS_VERSION=2.6.12
#(nop) ENV RUBY_DOWNLOAD_SHA256=4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654
#(nop) ENV RUBY_VERSION=2.4.1
#(nop) ENV RUBY_MAJOR=2.4
mkdir -p /usr/local/etc && { echo 'install: --no-document'; echo 'update: --no-document'; } >> /usr/local/etc/gemrc
set -ex; apt-get update; apt-get install -y --no-install-recommends autoconf automake bzip2 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 libncurses-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/*

apt-get update && apt-get install -y --no-install-recommends   bzr   git   mercurial   openssh-client   subversion     procps  && rm -rf /var/lib/apt/lists/*

apt-get update && apt-get install -y --no-install-recommends ca-certificates curl wget && rm -rf /var/lib/apt/lists/*
#(nop) CMD ["bash"]
#(nop) ADD file:9c48682ff75c756544d4491472081a078edf5dd0bb5038d1cb850a1f9c480e3e in /


  • ruby系のインストール

  • bundlerのインストール

  • apt-getでビルドに必要なもの入れているっぽい


結論



  • circleci/ruby:2.4.1-node-browsersはわりと名前の通り


    • xvfbとかphantomjsとかchromeとかそのへん使う場合に有益っぽい

    • nodeは8系。stableを使うポリシーなのかedgeを利用するポリシーなのかとかは不明


      • 地味に一番知りたかったのはこれだった。目的達成





  • 他のtagは?


    • 普通にそれぞれが必要な分入ってる


    • circleci/ruby:2.4.1-nodeだとchromeとかxvfb入ってない


    • circleci/ruby:2.4.1-browsersだとnodeとかyarn入らない