是的, 当我尝试使用 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 命令。
这刚刚为我解决了:
- 在 Windows 10 中安装 WSL2
- 使用 PowerShell 并导航到
acme.json
文件所在的目录 - 键入
wsl
,这将打开相同的位置,但现在来自 WSL2 - 类型
chmod 600 acme.json
- 做!