Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重构 Dockerfile, 并添加在 acme.sh 容器内重启其它容器的功能 #4204

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

pexcn
Copy link
Contributor

@pexcn pexcn commented Jul 25, 2022

主要是为了 SSL 证书更新后,便于在其它容器内重载证书。

使用方法:

  1. 给 acme.sh 容器自身添加一个 label, 为了让 DEPLOY_DOCKER_CONTAINER_RELOAD_CMD 在本容器执行
  2. 映射 /var/run/docker.sock 给 acme.sh 容器
  3. DEPLOY_DOCKER_CONTAINER_RELOAD_CMD 命令为 restart-container.sh <容器名称> (容器名称可以填多个,以空格分隔)

完整 docker-compose.yml 配置示例如下:

version: '3.9'

services:
  acme.sh:
    image: neilpang/acme.sh:3.0.4
    container_name: acme.sh
    restart: unless-stopped
    network_mode: host
    environment:
      TZ: Asia/Taipei
      HE_Username: username
      HE_Password: password
      DEPLOY_DOCKER_CONTAINER_LABEL: "com.example.container.name=acme.sh"
      DEPLOY_DOCKER_CONTAINER_RELOAD_CMD: "restart-container.sh nginx_1 nginx_2 nginx_3"
    volumes:
      - ./acme.sh-data:/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro
    labels:
      - "com.example.container.name=acme.sh"
    command: daemon

@Neilpang
Copy link
Member

@pexcn
Copy link
Contributor Author

pexcn commented Jul 25, 2022

https://github.com/acmesh-official/acme.sh/wiki/deploy-to-docker-containers

@Neilpang 这个文档我看过了,如果目标容器不提供重载证书功能(如: nginx -s reload),是无法重新加载证书的。
所以我在 acme.sh 容器添加了一个 restart-container.sh 脚本,它可以通过 Docker 的 API 直接重启其它容器。

@Neilpang
Copy link
Member

如果对方容器没有提供 graceful 的 reload 方式, 就不能从外部强行去重启. 这不安全,会造成数据损坏.

@pexcn
Copy link
Contributor Author

pexcn commented Jul 25, 2022

如果对方容器没有提供 graceful 的 reload 方式, 就不能从外部强行去重启. 这不安全,会造成数据损坏.

对于某些程序,强行重启是没有任何影响的。例如:使用了 v2ray 插件的 shadowsocks-rust, 而且此脚本也仅添加了一个功能,是对于没办法进行 graceful reload 的一个补充,至于是否使用,取决于用户本身。

另附上相关 issue: shadowsocks/shadowsocks-rust#748

@Neilpang
Copy link
Member

如果非要支持强制重启, 不如稍微修改这个文件 https://github.com/acmesh-official/acme.sh/blob/master/deploy/docker.sh
让它以某种方式支持重启就好了. 可以走 sock, cli, 或者 curl. 不用这么复杂.

@pexcn
Copy link
Contributor Author

pexcn commented Jul 25, 2022

@Neilpang 但是 docker.sh 似乎不支持在多个容器中执行命令,改起来可能比较复杂。

例如我有一个证书被 shadowsocks-rust 的 v2ray 和 xray 容器使用(一个证书被多个容器使用),而 docker.sh 只支持单个容器。这种情况下似乎用 restart-container.sh 来重启多个容器的方式更好。

@Neilpang
Copy link
Member

有两个解决方案:

  1. 把证书文件都 -v 到主机上,同一个位置.
    然后再主机上运行 acme.sh 申请证书. 然后 用 --install-cert --reload-cmd "docker restart A && docker restart B"

  2. 或者修改 docker.sh, 让 DEPLOY_DOCKER_CONTAINER_LABEL 支持逗号分隔多个container 即可.

@pexcn
Copy link
Contributor Author

pexcn commented Jul 25, 2022

对于有系统洁癖的用户来说,方案 2 会更好。
我会想办法修改 docker.sh 看看如何实现,但是对不怎么熟悉 linux shell 的我来说有些困难,可能无法实现,可能还需大佬的支持🤝 @Neilpang

@Neilpang
Copy link
Member

很多地方都是支持逗号分隔的. 所以基本工具都是有的. 找到跟着用就好了.
我不想在多增加任何文件了. 有些文件还要进一步删除.

pexcn added a commit to pexcn/docker-images that referenced this pull request Jul 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants