为什么当文件存在时,docker-compose 会发出“没有此文件或目录”?

为什么当文件存在时,docker-compose 会发出“没有此文件或目录”?

我正在测试我的服务器的裸机恢复,它基本上启动了一组包含我服务的 docker 容器。我从备份中恢复/etc/docker,其中我保留了所有配置和持久卷。

然后我尝试启动其中一个容器:

root@srv-backup:/etc/docker# docker-compose --verbose -f /etc/docker/docker-compose.d/20-registry.yaml up
compose.config.config.find: Using configuration files: /etc/docker/docker-compose.d/20-registry.yaml
ERROR: compose.cli.main.main: .IOError: [Errno 2] No such file or directory: '/etc/docker/docker-compose.d/20-registry.yaml'

但文件在那里:

root@srv-backup:/# ll /etc/docker/docker-compose.d/20-registry.yaml
-rwxrwxr-x+ 1 root root 842 Jan 24 15:19 /etc/docker/docker-compose.d/20-registry.yaml*

root@srv-backup:/# cat /etc/docker/docker-compose.d/20-registry.yaml
services:
  registry:
    container_name: registry
    image: registry
    labels:
      - traefik.http.routers.registry.rule=Host(`registry.example.com`)
      - traefik.http.routers.registry.entryPoints=https
      - traefik.http.routers.registry.tls=true
      - traefik.http.routers.registry.tls.certresolver=le
      - traefik.http.middlewares.lan.ipwhitelist.sourcerange=192.168.10.0/24, 192.168.20.0/24
      - traefik.http.routers.registry.middlewares=lan
      - traefik.enable=true
    restart: unless-stopped
    volumes:
      - /etc/docker/container-data/registry:/var/lib/registry
version: '3'

root@srv-backup:/# file /etc/docker/container-data/registry
/etc/docker/container-data/registry: directory

我尝试了各种使用相对路径和完整路径的咒语 - 问题是一样的。

我想知道 docker 守护进程是否有权访问该文件,但它也以如下方式运行root

root@srv-backup:/# ps -ef | grep docker
root      2048     1  0 10:58 ?        00:00:08 dockerd -G docker --exec-root=/var/snap/docker/423/run/docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/var/snap/docker/423/run/docker.pid --config-file=/var/snap/docker/423/config/daemon.json
root      2200  2048  0 10:58 ?        00:00:07 containerd --config /var/snap/docker/423/run/docker/containerd/containerd.toml --log-level error

我很困惑为什么它不起作用(docker 文件在我试图在 DRP 练习中复制的服务器上正常工作)

答案1

我找到了一个解决方法(这不完全是问题的答案,但可以继续前进)。

  1. 我卸载了dockersnap 安装:snap remove docker
  2. docker从存储库安装:apt install docker.io
  3. 已安装 docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

现在我用来启动示例容器的命令可以正常工作了。

的 snap 版本肯定有一些特别之处docker

答案2

它也可以像我一样简单:只需启动 docker。

错误信息有点令人恼火。

答案3

这确实帮助了我

pip3 install --upgrade --force-reinstall --no-cache-dir docker-compose && ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

答案4

遇到了同样的错误,但在我的例子中,它找不到Dockerfile。结果是我指定的文件路径在上下文路径中无效我已经提供了。例如,我有:

/myproject
  /myapp
  /docker
    /myapp.Dockerfile
    /docker-compose.yaml

以及docker-compose.yaml

services:
  myapp:
  build:
    context: ..
    dockerfile: myapp.Dockerfile

然后我开始运行:

cd /myproject/docker
docker compose up -d

它会抱怨myapp.Dockerfile找不到,结果证明这是正确的。
上下文被指定为父文件夹(..),因此dockerfile属性应该是docker/myapp.Dockerfile

相关内容