Acme.json 的 Traefik 权限 777 太开放了,请使用 600



是的, 当我尝试使用 https 运行 traefik 时,我得到了这个。问题是我在Win7机器上挂载了目录,但我无法chmod文件。

装载工作正常,但文件权限已关闭。

看起来像这样:

volumes
- d:/docker/traefikcompose/acme/acme.json:/etc/traefik/acme/acme.json:rw

traefik | time="2018-09-04T12:57:11Z" 级别=错误 msg="错误 起始提供程序 *极致。提供商: 无法获取 ACME 帐户: 請對/etc/traefik/acme/acme.json 的權限 777 太開了,請 使用 600">

如果我删除 acme.json 文件,我会得到这个:

错误:对于 traefik 无法启动服务 traefik:b'OCI 运行时创建 失败:container_linux.go:348:导致启动容器进程 "process_linux.go:402:容器初始化导致\"rootfs_linux.go:58: 将 \\\"/d/docker/traefikcompose/acme/acme.json\\\" 挂载到 根FS \\\"/mnt/sda1/var/lib/docker/aufs/mnt/c84d8644252848bde8f0322bafba3d206513ceb8479eb95aeee0b4cafd4a7251\\\" 在 \\\"/mnt/sda1/var/lib/docker/aufs/mnt/c84d8644252848bde8f0322bafba3d206513ceb8479eb95aeee0b4cafd4a7251/etc/traefik/acme/acme.json\\\" 导致\\"不是目录\\\"\":未知:您是否正在尝试 将目录挂载到文件上(反之亦然(?检查是否指定 主机路径存在,并且是预期的类型'

多亏了库沙尔的帮助,我终于找到了解决方案,

我们必须通过 ssh 连接到 virtualbox-machine 并在那里制作文件,然后直接从 docker-compose.yml 中指出它,在这种情况下,我这样做了:

docker-machine ssh default
touch /var/acme.json
chmod 600 /var/acme.json

然后在我的 docker 撰写中:

volumes:
- /var/:/var/acme.json

最后在traefik.toml中:

[acme]
storage = "acme.json"

除了上述答案之外,要自动创建acme.json文件并分配所需的权限,请创建一个 Dockerfile 并在您的docker.compose.yml中调用它

FROM traefik:2.2
RUN touch /acme.json 
&& chmod 600 /acme.json

我用命名的docker卷解决了这个问题:

docker-compose.yml (仅显示文件的相关部分(

services:
traefik:
environment:
- TRAEFIK_CERTIFICATESRESOLVERS_LE_ACME_STORAGE=/acme/acme.json
volumes:
- acme:/acme
volumes:
acme:

我和你有同样的问题,想把 acme.json 文件放在容器/卷之外,即在主机 FS 上。通过这种方式,我想使备份变得容易,因为我的测试有时会很快超过let's encrypt/ACME配额。

码头工人窗口

事实证明,在 Docker Windows 上,您可以在 traefik 容器中获得此权限:

-rwxrwxrwx    1 root     root           0 Dec 22 15:21 acme.json and on Linux

Docker Linux (ubuntu 22.04(

如果 traefik 使用如下内容在主机端创建文件:

docker run -v ./acme:/acme ... traefik

在 Linux docker 上,容器端看起来不同:

-rw-------    1 root     root       15.7K Dec 22 15:14 acme.json

但是在主机上我也有这个:

-rw-------    1 root     root       15.7K Dec 22 15:14 acme.json

这意味着我的普通用户无法查看/备份或修改该文件。

我认为目前在主机 FS 端维护此文件没有足够的支持。

建议

将此文件存储在 docker 卷中,并使用"docker cp"访问它:

备份:

docker container cp traefik:/acme/acme.json .

恢复:

docker container cp acme.json traefik:/acme/
docker exec -it traefik -> chmod 0700 /acme/acme.json
docker container restart traefik

这可以使用 Dockerfile/entrypoint.sh 来解决,工作原理如下:

Dockerfile

FROM traefik:v2.9.4
COPY entrypoint.sh /
ENTRYPOINT [ "/entrypoint.sh" ]
CMD ["traefik"]

entrypoint.sh

#! /bin/sh
set -e
echo "Setting acme.json permissions 0600"
touch /works
touch /acme/acme.json
chmod 600 /acme/acme.json
chown root:root /acme
chown root:root /acme/acme.json
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- traefik "$@"
fi
# if our command is a valid Traefik subcommand, let's invoke it through Traefik instead
# (this allows for "docker run traefik version", etc)
if traefik "$1" --help >/dev/null 2>&1
then
set -- traefik "$@"
else
echo "= '$1' is not a Traefik command: assuming shell execution." 1>&2
fi
exec "$@"

在docker-compose.yaml中,我有:

traefik:
#image: traefik:v2.9.4
build: traefik/

所以一个 docker compose build && docker compose up -d 根据 entrypoint.sh 中的脚本更新了文件权限

注意:从 entrypoint.sh 更新/acme/acme.json 文件非常重要,因为卷已经挂载完毕。仅使用 Dockerfile 时,情况并非如此。

注意:我正在使用 docker compose,但 docker 也将支持此功能,但在命令上具有不同的 synatx。

总结

我认为这也是太多的维护负担。在 docker 社区中,我们应该提出一个卷系统,该系统可以在容器的目录上设置所有者/模式,并将文件保留在主机上,无论它们拥有什么所有者/模式。

卷:

"File:Acme.json:
  • /Acme.json:root:root:0600">

此外,如果主机上不存在该文件,请直接创建它。Linux docker 确实在主机上创建它,而 Docker Windows 将无法启动 docker compose up -d 命令。

这刚刚为我解决了:

  1. 在 Windows 10 中安装 WSL2
  2. 使用 PowerShell 并导航到acme.json文件所在的目录
  3. 键入wsl,这将打开相同的位置,但现在来自 WSL2
  4. 类型chmod 600 acme.json
  5. 做!

相关内容

最新更新