Dockerイメージのビルド時のSSL証明書エラー回避方法(マルチビルド活用方法)(社内Proxyにハマってる?)

Docker

✅ 概要

社内LANを使用してDockerイメージを作成する際、docker build コマンドを実行するとSSL証明書エラーが発生し、Dockerfile内に記載した aptdnfyum でのインストールが失敗するケースはありませんか?

例えば、Amazon Linux 2023 のイメージを使用して dnf install を試みると以下のようなエラーが発生することがあります:

1.502 Amazon Linux 2023 repository                    0.0  B/s |   0  B     00:00    
1.503 Errors during downloading metadata for repository 'amazonlinux':
1.503   - Curl error (60): SSL peer certificate or SSH remote key was not OK for https://cdn.amazonlinux.com/al2023/core/mirrors/2023.1.20230825/x86_64/mirror.list [SSL certificate problem: unable to get local issuer certificate]
1.503 Error: Failed to download metadata for repo 'amazonlinux': Cannot prepare internal mirrorlist: Curl error (60): SSL peer certificate or SSH remote key was not OK for https://cdn.amazonlinux.com/al2023/core/mirrors/2023.1.20230825/x86_64/mirror.list [SSL certificate problem: unable to get local issuer certificate]

これは、社内プロキシなどを経由した場合に発生しやすい問題です。SSL証明書の問題を回避する方法を紹介します。


✅ 原因と対策

結論としてエラーの原因は、コンテナ内でSSL証明書が正しく認識されていないことです。以下の方法で回避できます:

COPY {対象の証明書}.crt /etc/ssl/certs/
RUN cat /etc/ssl/certs/{対象の証明書}.crt.crt >> /etc/ssl/certs/ca-certificates.crt

非推奨のやり方ではありますが、/etc/ssl/certs/ca-certificates.crtに直接証明書を追加すれば証明書問題は回避できます。下記の方法でもできます。

独自(root)CA のインストール方法 - Qiita
独自の root CA 証明書をインストールする必要があり、まとめました。色々とツールやアプリケーションを使っていると「OS に設定すればひと安心」というわけにはいかず、OS の設定に加えて、それ…

では、今回紹介したいのは、マルチビルドで開発環境とクラウド上での識別をするというところです。

  1. SSL証明書を組み込んだビルド処理を分離する(マルチビルド)
  2. WGETCURL_CA_BUNDLE の変数を切り替えて処理を分岐する

✅ Dockerfile(マルチビルド処理)

ARG BUILD_TARGET="cloud"  # ローカルで実行する場合は、ターゲットをdocker-compose.yamlで`proxy`に上書きをする(この後docker-compose.yaml紹介します。)

# 共通処理
FROM amazonlinux:2023 AS base-image

# proxy対応の準備前処理
FROM base-image AS proxy-pre
ARG WGET="wget --ca-certificate=/etc/ssl/certs/ca-certificates.crt"
ARG CURL_CA_BUNDLE="/etc/ssl/certs/ca-certificates.crt"

# 自社プロキシ証明書を追加
COPY app/証明書.crt /etc/ssl/certs/
RUN cat /etc/ssl/certs/証明書.crt >> /etc/ssl/certs/ca-certificates.crt

# クラウド用の準備処理
FROM base-image AS cloud-pre
ARG WGET="wget"               # 証明書の指定無し
ARG CURL_CA_BUNDLE=""         # 証明書の指定無し

# 共通Build処理
FROM ${BUILD_TARGET}-pre AS build      # ${BUILD_TARGET}でproxyの有無

# 必要なライブラリをインストール
RUN dnf install -y 必要なライブラリ

# wgetでのインストール(例)
RUN ${WGET} https://必要なライブラリやパッケージなど | tar -xz

# pip install
RUN CURL_CA_BUNDLE=${CURL_CA_BUNDLE} pip isntall 必要なライブラリ

........

FROM build AS proxy-runtime-setup
...

FROM build AS cloud-runtime-setup
...

FROM ${BUILD_TARGET}-runtime-setup AS final-image

✅ コード解説

  1. 共通処理の定義 (AS image):
    • Amazon Linux 2023 ベースのイメージを定義。
  2. Proxy対応の準備処理 (AS proxy-pre):
    • WGET と CURL_CA_BUNDLE の環境変数を設定。
    • 自社プロキシ用のSSL証明書をコンテナ内に配置し、ca-certificates.crt に追記。
  3. クラウド用の準備処理 (AS cloud-pre):
    • 標準の wget コマンドを使用し、証明書の指定を行わない設定。
    • クラウド環境用に CURL_CA_BUNDLE は無効化。
  4. ビルド処理 (AS build):
    • ${BUILD_TARGET}-pre によって、環境に応じたビルドを実行。
    • dnf を使ったライブラリのインストールが適切に処理される。
    • pip installも環境変数を指定しているためproxy経由で通ります。

✅ Docker Composeと組み合わせた使い方

docker-compose.yaml を使うことで、ビルド環境を簡単に切り替えることができます。

docker-compose.yaml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_TARGET: "proxy"  # ローカルビルドを指定

✅ まとめ

Dockerイメージビルド時に発生するSSL証明書エラーを回避する方法を紹介しました。

  • SSL証明書の追加処理をビルドステージとして分離することで、環境に応じたビルド処理が可能。
  • WGET** と CURL_CA_BUNDLE の環境変数を切り替えて柔軟にビルドを調整できる。**
  • Docker Composeと組み合わせて環境ごとにビルドを簡単に切り替えられる仕組み。

この方法を利用することで、社内プロキシ環境やクラウド環境でも効率的にDockerビルドを行えます。ぜひ試してみてください。

コメント

  1. こんにちは、これはコメントです。
    コメントの承認、編集、削除を始めるにはダッシュボードの「コメント」画面にアクセスしてください。
    コメントのアバターは「Gravatar」から取得されます。

タイトルとURLをコピーしました