ホーム自己紹介ブログ
NO.119
DATE2024. 03. 29

Docker Image に 構造化テスト container-structure-test を試してみた

Dockerイメージ内の構造や設定が期待通りかどうかを検証する container-structure-test を知りました。

container-structure-test GitHub リポジトリ

せっかくなので、試してみました。

環境構築

まず、container-structure-test をインストールします。MacOSの場合、Homebrewを使用すると簡単にインストールできます。

brew install container-structure-test

次に、テスト対象のDockerイメージをビルドするために、以下の内容のDockerfileを準備し、イメージをビルドします。

## ./Dockerfile
## @see: https://github.com/silverbirder/testcontainers-nextjs/blob/main/Dockerfile
 
## ...
 
##### RUNNER
 
FROM --platform=linux/amd64 node:18.17-alpine3.18 AS runner
WORKDIR /app
 
ENV NODE_ENV production
 
## ENV NEXT_TELEMETRY_DISABLED 1
 
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
 
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
 
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
 
USER nextjs
EXPOSE 3000
ENV PORT 3000
 
CMD ["node", "server.js"]

ビルドコマンドは以下の通りです。

docker build . -t app:latest

このコマンドは、タグ名を app:latest としてDockerイメージをビルドします。

container-structure-test を使ったテスト

container-structure-test は、ビルドしたDockerイメージに対して様々なテストを実行することができます。 以下のコマンドを実行することでテストを開始できます。

container-structure-test test \
  --image app:latest \
  --platform linux/amd64 \
  --config config.yml

config.yml には、実行したいテストの設定を記述します。以下はその例です。

## config.yml
schemaVersion: "2.0.0"
commandTests:
  - name: "cat server.js"
    command: "cat"
    args: ["server.js"]
    expectedOutput: [".*startServer.*"]
fileContentTests:
  - name: "package.json"
    expectedContents: ["testcontainers-nextjs"]
    path: "/app/package.json"
fileExistenceTests:
  - name: "package.json"
    path: "/app/package.json"
    shouldExist: true
    permissions: '-rw-r--r--'
    uid: 1001
    gid: 1001
metadataTest:
  envVars:
    - key: PORT
      value: 3000
    - key: NODE_ENV
      value: production
  exposedPorts: ["3000"]
  cmd: ["node", "server.js"]
  workdir: "/app"
  user: "nextjs"
## licenseTests:
## - debian: true
##   files: ["/foo/bar", "/baz/bat"]

container-structure-test で実行できるテストには、以下のような種類があります。

  • commandTests
    • イメージからコマンドを実行し、期待する出力が得られるかを検証します。
  • fileContentTests
    • 特定のファイルが期待する内容を含んでいるかをテストします。
  • fileExistenceTests
    • ファイルの存在有無、権限、所有者を検証します。
  • metadataTest
    • 環境変数やポートの露出、実行ユーザーなどのメタデータを検証します。
  • licenseTests
    • 著作権ファイルのリストをチェックして、Googleで許可されているライセンスのみが使用されていることをテストします。

詳しくは、container-structure-test GitHub リポジトリ をご確認ください。

commandTests は、Dockerコンテナを作成して、CMDを実行してテストするようです。 エラーやワーニング、セキュリティなどのログが発生しないことを確認するのはよさそうです。

fileContentTests は、何に使えそうか思いつかなかったです。

fileExistenceTests は、permissionsやuid,gidを確認できるので、許可してはいけないものをチェックするのによさそうです。

metadataTest は、アプリに必要な環境変数を正規表現でテストするのは良さそうです。

licenseTests は、何に使えそうか思いつかなかったです。

まとめ

container-structure-test は、Dockerイメージが期待する仕様を満たしているかを自動で検証するためのツールです。 この記事で紹介した基本的な使い方とテストの例を参考に、安全で信頼性の高いコンテナ環境の構築に役立ててください。

テスト
クラウドインフラ

シェアする

フォローする

次のページ

生成AI時代のフロントエンド開発術

前のページ

Testcontainersを用いたNext.jsとDBの結合テスト

関連する記事

タグ「テスト」の記事

CSS Layout Testing というテスト手法の提案

Web のフロントエンド実装において、次のようなミスによってデザイン崩れを起こしてしまったことはありませんか。 flex-shrink の指定を忘れて、要素が押しつぶされてしまった z-index の指定を間違えて、要素が意図せず前面(また

2026-01-10

フロントエンド
テスト
単体テストを全通り書くんじゃない!

AIの進化によって、プロダクションコードに対するテストコードは、以前と比べて格段に書きやすくなったと感じています。 単体テストに関する基本的なお作法については、以前に以下の記事で整理しました。 興味があれば、参考として読んでもらえると嬉しい

2026-01-09

テスト
Playwright の POM を Storybook 上で確認してから E2E テストを書く

はじめに Playwright で E2E テストを書く際、playwright codegen や、近年では Playwright MCP を利用して、テストコードの雛形を作成することが多いと思います。 ただし、生成したテストコードが正し

2025-12-26

テスト

タグ「クラウドインフラ」の記事

BigQueryだけで完結するモック可能なユニットテスト手法

BigQuery、皆さん使っていますか? 私は、業務でBigQueryを使ったデータ構築をしています。品質担保のため、BigQueryのSQLに対してテストをしたいと考えています。本記事では、BigQueryだけで完結し、かつ、Mockデータを差し替え可能なユニットテスト手法について、紹介します。

2021-11-26

フロントエンド
クラウドインフラ
テスト
TikTokスクレイプ基盤をGCP上で構築してハマったこと

TikTokへスクレイプするバッチをGCP上で構築しました。GCP構築のシステム設計話と、その構築時に、ハマったことを共有します。

2021-08-28

サービス
クラウドインフラ
成果物
クローリング
コロナ禍におけるエンジニアのためのCloud IDE

2020年3月頃からコロナが流行りだし、もう12月になります。働き方が大きく変わり、リモートワークが当たり前の時代となりました。エンジニアの働き方も同様に変わりました。そこで、今回はCloud IDEというものを紹介しようと思います。

2020-12-12

クラウドインフラ
← ブログ一覧へ