dockerの中で動いているnginxの中にあるfullchain.pem と privkey.pemを交換する方法
■外部から強制的に書き込もうとすると失敗します
ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ docker ps
095fe60f02cc nginx:1.15-alpine "nginx -g 'daemon of…" 8 weeks ago Up 22 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp xxxxxxx_ride_hailing_go_nginx_1
でもって、
ubuntu@ip-172-26-7-19:~/codes/xxxxx_ride_hailing_go$ sudo docker cp fullchain.pem 095fe60f02cc://etc/nginx/conf.d/
Error response from daemon: Error processing tar file(exit status 1): unlinkat /etc/nginx/conf.d/fullchain.pem: device or resource busy (失敗します)
しかし、dockerの中に入って、
ubuntu@ip-172-26-7-19:~/codes/xxxxxx_ride_hailing_go$ docker exec -i -t xxxxx_ride_hailing_go_nginx_1 sh
で内側から、killすると、dockerごとダウンして、なんとも悩ましい、にわとりと卵の関係になってしまいます。
■解決方法
ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ sudo docker cp fullchain.pem 095fe60f02cc://etc/nginx/conf.d/fullchain.pem.new
ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ sudo docker cp privkey.pem 095fe60f02cc://etc/nginx/conf.d/privkey.pem.new
でもって、 (今後は、new2, new3, new4 とか、どんどん増やしていく)
ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ vi nginx.conf
をして、
———————————————————
ssl_certificate /etc/nginx/conf.d/fullchain.pem.new;
ssl_certificate_key /etc/nginx/conf.d/privkey.pem.new;
———————————————————
と書き換える。
さらに、
docker-compose.yml の最後の行に、
volumes:
- "./nginx.conf:/etc/nginx/conf.d/default.conf"
- "./fullchain.pem:/etc/nginx/conf.d/fullchain.pem.new"
- "./privkey.pem:/etc/nginx/conf.d/privkey.pem.new"
も変える。
でもって、 docker-compose stop; docker-compose start をすれば、新しい鍵で動き出します。不細工ではありますが、プログラムは動くようになります。
■ところで今思いついたんだけど、いい方法がありました。
現在は、fullchain.pem.new と、privkey.pem.new で動いているのだから、fullchain.pem と、privkey.pemは、rm できるはず。
で、cp fullchain.pem.new fullchain.pem, cp privkey.pem.new privkey.pem として、さらに、nginx.confの設定を元に戻せば、fullchain.pem と、privkey.pem の名前を使えるはずです
(まあ、動いているので、今は、このままにしています)
■もっと、いい方法がありました。
docker-compose.yml の最後の行に、
volumes:
- "./nginx.conf:/etc/nginx/conf.d/default.conf"
- "./fullchain.pem:/etc/nginx/conf.d/fullchain.pem"
- "./privkey.pem:/etc/nginx/conf.d/privkey.pem"
の3行を加えれば、Dockerの外側に、最新の"fullchain.pem"と、"privkey.pem"を置いておけば、自動的にDockerコンテナの中に取り込まれます(今、そうなっている)