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でボイラープレート出てくるのも知らなかった。。。
-
setup-projectしたときのデフォルトは
- なんとなくフロント好きおじさんからするとnodeってバージョン何入ってるんだ!が気になった。
dockerの中身が見たい。
残念ながらDockerfileは公開されていないっぽい
ここで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入らない