docker-撰写忽略 DOCKER_HOST

docker-compose ignores DOCKER_HOST

我正在尝试 运行 3 Docker 图像、MySQL、Redis 和我在 Bash 上的一个项目 Windows (WSL)。

为此,我必须在 Windows 上连接到 Docker 引擎 运行,特别是在 tcp://locahost:2375 上。我已将以下行附加到 .bashrc:

export DOCKER_HOST=tcp://127.0.0.1:2375

我可以成功地 运行 docker 命令,例如 docker psdocker run hello-world 但是每当我 cd 进入我的项目目录和 运行 sudo docker-compose up --build 加载图像并启动容器时出现错误:

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

我知道,如果我使用 -H 参数,我可以提供地址,但我宁愿找到一个更永久的解决方案。出于某种原因 docker-compose 似乎忽略了 DOCKER_HOST 环境变量,我不明白为什么..

您的问题是sudo。它是一个与您的 shell 完全不同的程序,除非您特别指定,否则不会传输导出的环境。您可以在 /etc/sudoers(或 /etc/sudoers.d/docker)中添加以下行:

Defaults env_keep += DOCKER_HOST

或者您可以直接将其传递给命令行:

sudo DOCKER_HOST=$DOCKER_HOST docker-compose up --build 

通过设置 DOCKER_HOST,您可以在命令行中告诉 docker 的每个 运行 使用 http api,而不是默认 - socket on localhost.

默认http api未开启

$ sudo cat /lib/systemd/system/docker.service | grep ExecStart
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

您可以在本地主机上的 http api 上为 tern 添加 -H tcp://127.0.0.1:2375 但通常你想通过 -H tcp://0.0.0.0:2375 为远程服务器启用 api(仅使用适当的防火墙)

因此您需要在 /lib/systemd/system/docker.service 中更改为下一行

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375 --containerd=/run/containerd/containerd.sock