使用 docker-machine 但不是在 ssh 服务器上时出错:您是否正在尝试将目录挂载到文件上(或反之亦然)?

Error when using docker-machine but not on ssh server: Are you trying to mount a directory onto a file (or vice-versa)?

我正在运行在ubuntu(ec2-instance)服务器上使用nginx 运行安装一个docker化的django 应用程序。我的想法是用 docker-machine.

部署

当我通过 ssh 进入我的 EC2 并将我的应用程序复制到那里,然后启动我的 docker-compose 文件时,一切正常,应用程序 运行 完美无缺。但是我想在不使用 ssh 进入服务器的情况下启动我的容器,而是使用 docker 机器。

当我将执行命令指向我的 EC2 实例和 运行 相同的命令 (docker-compose -f production.yml up --build) 时,我收到以下错误:

Cannot start service production-nginx-container: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \"/Users/myuser/myfolder/myproject/compose/production/nginx/myconf.conf\" to rootfs \"/var/lib/docker/overlay2/44675a2cf4ac6e3052c9df3bd6fbb35b1ece33736d632199572c6a1c90965c12/merged\" at \"/var/lib/docker/overlay2/44675a2cf4ac6e3052c9df3bd6fbb35b1ece33736d632199572c6a1c90965c12/merged/etc/nginx/conf.d/default.conf\" caused \"not a directory\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

我认为 docker 抱怨的是这一行:

- ./compose/production/nginx/myconf.conf:/etc/nginx/conf.d/default.conf

我正在尝试将我的配置从我的 nginx 文件映射到 nginx docker 容器的默认配置中。 myconf.conf 在那里,它是一个文件。

我的猜测是将文件从本地计算机加载到服务器上的容器时出现问题?但我不知道如何解决这个问题……此外,关于此错误的其他问题也无济于事。

我 运行 和 docker 机器指向实例的命令不应该做完全相同的事情,就像我通过 ssh 进入我的实例并 运行 它来自那里?不幸的是,我对 docker 的了解有限。如果有人能帮我一把,我将不胜感激。

非常感谢,请在下面查看我的配置:

production-nginx-container:
    container_name: 'production-nginx-container'
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./compose/production/nginx/myconf.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt/live/mydomain.de/fullchain.pem:/etc/letsencrypt/live/mydomain.de/fullchain.pem
      - /etc/letsencrypt/live/mydomain.de/privkey.pem:/etc/letsencrypt/live/mydomain.de/privkey.pem
    depends_on:
      - django


即使您使用远程 $DOCKER_HOST Docker 也无法将本地内容挂载到远程容器。 docker run -v 选项和 Docker Compose volumes: 绑定安装始终被视为 Docker 守护程序所在的主机上的路径 运行ning,而不是你 运行宁docker 命令。您需要将配置文件和 TLS 证书等内容复制到远程主机,在执行此操作时,您也可以使用 ssh 来启动容器。

您可能会考虑 Ansible、Chef 或 Salt Stack 等自动化工具是否满足您的需求。这些通常具有用于 "make sure this file is on the remote system" 和 "start this container on some remote system" 的内置工具。我不建议使用 Docker 机器,除非在特定情况下需要本地 VM 到 运行 Docker(通常通过 Docker 工具箱应用程序,在 Windows 7 或其他没有 "native" Docker 应用程序可以使用的环境)。