ruby:2.6.5-slim-stretch
のDockerイメージを使い yarn を入れるのに苦労したので記録を残しておきます。
RUN部分の抜粋。
ENV YARN_VERSION=1.22.4
RUN bash -c "curl -sL --compressed https://yarnpkg.com/downloads/${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz | tee >(tar zx -C /usr/local/ --strip=1 --wildcards yarn*/bin --no-same-owner --no-same-permissions) | tar zx -C /usr/local/ --strip=1 --wildcards yarn*/lib --no-same-owner --no-same-permissions"
3つのコマンドをパイプで連結した文字列を用意して bash -c "curl..."
で実行するようにしています。
はじめに curl を使って指定されたバージョンの yarn を標準出力に表示します。
curl -sL --compressed https://yarnpkg.com/downloads/${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz
tee を使い出力先を分岐します。 /usr/local/bin
に tar内の */bin
以下を展開します。
| tee >(tar zx -C /usr/local/ --strip=1 --wildcards yarn*/bin --no-same-owner --no-same-permissions)
同様に /usr/local/lib
に tar 内の */lib
以下を展開します。
| tar zx -C /usr/local/ --strip=1 --wildcards yarn*/lib --no-same-owner --no-same-permissions
bash -c ""
をしているのは、 2つ目の | tee >(tar...)
にてプロセス展開を行うためです。
docker build
を行う際に sh
環境で実行されるので、プロセス展開部分で、 /bin/sh: 1: Syntax error: "(" unexpected
がでてしばらく悩みました…。