VS Code の Dev Container では Dockerfile の ENTRYPOINT が実行されない(っぽい)ので "postCreateCommand" プロパティで代替する

結論

devcontainer.json 内に、たとえば以下のように書きます。

{
  (中略)
  "postCreateCommand": ".devcontainer/devcontainer_entrypoint.sh"
  (中略)
}

上記の devcontainer_entrypoint.sh 内に、DockerfileENTRYPOINT の内容を移植すればよいかと思います。独自のコマンド等を入れたい場合には、ENTRYPOINT の内容を含み、かつそれに独自のコマンドを追記する形になるでしょう。

参考

github.com

qiita.com

補足

これだと Dockerfile が書き換えられるたびに devcontainer.json も書き換えねばならずイケてないです。チーム開発では扱いづらい感じがします。もっとも、実際は ENTRYPOINT にダイレクトにコマンドを書くことは今ではほとんど無く、シェルスクリプトにまとまっているので問題ないかとは思いますが。

Dev Container 自体が個人での開発用の機能という位置づけなのかもしれません。用いる Dockerfile は、ECS や Cloud Run へのデプロイ、各レジストリへの push は想定していない*1のかもしれません。

*1:か、別で行う

GitHub Actions で直接 ${{ toJSON(hoge) }} する際に「半角スペース + #記号」が含まれていると syntax error になる

結論

どういうことかというと、以下のような場合です。

      - name: First step
        id: my_variables
        run: |
          echo "::set-output name=hoge::FOO #12345"
      - name: Second step
        run: |
          echo "${{ toJSON(steps.my_variables) }}"

このステップを含んだ Action を実行すると次のようなエラーになります。

... line 6: syntax error near unexpected token `}'

どうすればいいか

公式ドキュメントにもあるように、一度環境変数に格納するとよいです。先ほどの YAML を書き直してみます。

      - name: First step
        id: my_variables
        run: |
          echo "::set-output name=hoge::FOO #12345"
      - name: Second step
        env:
          STEPS_CONTEXT: ${{ toJson(steps.my_variables) }}
        run: |
          echo "${STEPS_CONTEXT}"

このように書き直して実行すると正しく実行されます。

背景

とある変数に uname -a の結果を代入したところ、この現象に遭遇しました。そのときの uname -a の出力は以下の通りで、今回の現象の条件を見事に満たしていました。

Linux docker-desktop 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

やや関連記事

qiita.com

"act" コマンド(GitHub Actions ローカル実行コマンド)では "if: failure()" は実行できない

補足

2022/01/08 現在の情報です。

結論

GitHub Actions のローカル実行コマンドである act では、if: failure() を用いたステップは実行されません。

所感

最初は書き方が間違っているのかと思ってムキになって $ act --rm を叩いていたのですが、ふと push したら何事もなかったかのように通りました。

ハマった 2時間 が虚しい……。

tarball の Node.js を、ワンライナーで arm と amd を判別してダウンロードする

結論

arch コマンドの出力を sed で処理します。

$ ARCHITECTURE=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/x64/) && curl -LO https://nodejs.org/dist/v16.13.1/node-v16.13.1-linux-$ARCHITECTURE.tar.xz

補足

  • Dockerfile で役に立ちそうです
  • Node のバージョンの部分*1も変数で指定するとハードコーディングが避けられます
  • このやり方でファイル名を指定できる場合はいいのですが、命名規則によってはより複雑な sed が必要になりそうです

ダウンロードページ

nodejs.org

*1:16.13.1

Powered by はてなブログ