【CircleCI】【Rails】【Docker】ArgumentError: key must be 16 bytes


assets:precompileで、ArgumentError: key must be 16 bytesが発生

Dockerfile.rails
ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}

**略

RUN bundle exec rails assets:precompile # 問題の箇所

以下、エラー写真

対処内容

ローカル環境でdocker buildしてみても同様のエラーは発生しなかったので、値の受け渡しに問題ありと仮説。

.circleci/config.yml
version: 2.1 
orbs:
  aws-ecr: circleci/[email protected]
workflows:
  lint_and_test_and_ecr_push:
    jobs:
      - aws-ecr/build-and-push-image:
          account-url: AWS_ECR_ACCOUNT_URL_ENV_VAR_NAME_RAILS
          aws-access-key-id: ACCESS_KEY_ID_ENV_VAR_NAME
          aws-secret-access-key: SECRET_ACCESS_KEY_ENV_VAR_NAME
          dockerfile: Dockerfile
          no-output-timeout: 20m
          extra-build-args: "--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}" # これが抜けていた…
          path: .
          region: AWS_REGION_ENV_VAR_NAME
          repo: repo-name
          filters:
            branches:
              ignore:
                - master

そもそも--build-argについて知見がなかったのが敗因。よく勉強しましょう。

DockerfileARGを指定してdocker buildの際に指定できる引数を宣言しても、中身を持ってこなければ意味がない。

イメージ

  • CircleCIの環境変数に値をセット
  • .circleci/config.ymlでDockerfileで展開する変数RAILS_MASTER_KEYを指定して、その変数にCircleCIで設定した環境変数RAILS_MASTER_KEYを代入
  • DockerfileのARG(RAILS_MASTER_KEY)がCircleCIで設定した環境変数の値を持った変数として機能する
  • DockerfileでENV(RAILS_MASTER_KEY)にARGで機能した変数RAILS_MASTER_KEYを代入することで、コンテナ内での環境変数(RAILS_MASTER_KEY)として機能する

参考

Dockerfile ARG入門
circleci/[email protected]
Dockerfileの"ENV"と"ARG"と"環境変数"について
Rails 5.2 + Docker, RAILS_MASTER_KEYをイメージ作成時に動的に入れる方法