Let's Encrypt
から証明書を発行および更新する公式のcertbot
( https://certbot.eff.org )ツールは、現在有効な証明書を${prefix}/archive/${domain}/certN.pem
に保存します。ここで、N
は任意の数です。現在有効な証明書とキーにアクセスするために使用する必要があるパスは、${prefix}/live/${domain}/cert.pem
の相対シンボリックリンクです。
root@skprov2:${prefix}/live/${domain}# ls
total 12K
4.0K drwxr-xr-x 2 root root 4.0K Jul 24 16:08 ./
4.0K drwx------ 9 root root 4.0K Aug 24 10:57 ../
0 lrwxrwxrwx 1 root root 39 Jul 24 16:08 cert.pem -> ../../archive/${domain}/cert2.pem
0 lrwxrwxrwx 1 root root 40 Jul 24 16:08 chain.pem -> ../../archive/${domain}/chain2.pem
0 lrwxrwxrwx 1 root root 44 Jul 24 16:08 fullchain.pem -> ../../archive/${domain}/fullchain2.pem
0 lrwxrwxrwx 1 root root 42 Jul 24 16:08 privkey.pem -> ../../archive/${domain}/privkey2.pem
4.0K -rw-r--r-- 1 root root 682 Jul 23 09:40 README
live
ディレクトリのみをマウントする場合、Dockerコンテナ内で実行されているプログラムは、相対的なシンボリックリンクが原因で、必要な証明書データのロードに失敗します。
certbot
からの最新の(有効な)証明書データをDockerコンテナー内でどのように使用できますか?
相対シンボリックリンクは、2層上(domain
フォルダーからlive
フォルダー、live
フォルダーからroot
フォルダー)にマップされ、次にarchive
フォルダーに入り、最後にdomain
サブフォルダーに入ります。
マウントを回避するにはallドメインサブディレクトリ、すべての証明書データへのアクセスを許可するには、2つのマウントを使用する必要があります。
Dockerホスト上でcertbotによって作成された次のディレクトリ構造を想定します。
/certbot/
|-live/
| |-domain.com
| | |-cert.pem
| | |-privkey.pem
| |-domain2.com
| |-cert.pem
| |-privkey.pem
|
|-archive/
|-domain.com
| |-cert.pem
| |-privkey.pem
|-domain2.com
|-cert.pem
|-privkey.pem
Dockerでは、ターゲットドメインのサブディレクトリのみをコンテナ内にマウントする必要があります。
docker run \
-v /certbot/live/domain.com:/cert/live/domain.com:ro \
-v /certbot/archive/domain.com:/cert/archive/domain.com:ro \
myimage:tag
このようにして、コンテナー内のプログラムはarchive
フォルダー内の相対パスを正常に解決できますが、その構成はlive
フォルダー内のシンボリックリンクを指します(/cert/live/domain.com/cert.pem
)。