【问题标题】:Error when using docker-machine but not on ssh server: Are you trying to mount a directory onto a file (or vice-versa)?使用 docker-machine 但不在 ssh 服务器上时出错:您是否尝试将目录挂载到文件上(反之亦然)?
【发布时间】:2020-01-20 12:50:05
【问题描述】:

我在 ubuntu (ec2-instance) 服务器上使用 nginx 运行 dockerized django 应用程序。我的想法是使用 docker-machine 进行部署。

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

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

无法启动服务生产-nginx-container:OCI运行时创建失败:container_linux.go:346:启动容器进程导致“process_linux.go:449:容器初始化导致\”rootfs_linux.go:58:挂载\\”/用户/myuser/myfolder/myproject/compose/production/nginx/myconf.conf\\" 到 rootfs \\"/var/lib/docker/overlay2/44675a2cf4ac6e3052c9df3bd6fbb35b1ece33736d632199572c6a1c90965c12/merged\\" 在 \\"/var/lib/docker /overlay2/44675a2cf4ac6e3052c9df3bd6fbb35b1ece33736d632199572c6a1c90965c12/merged/etc/nginx/conf.d/default.conf\\" 导致\\"not a directory\\"\"":未知:您是否尝试将目录挂载到文件上(或反之-反之亦然)?检查指定的主机路径是否存在并且是预期的类型

我认为 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


【问题讨论】:

    标签: django docker docker-compose docker-machine


    【解决方案1】:

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

    您可以在这里考虑是否像 Ansible、Chef 或 Salt Stack 这样的自动化工具满足您的需求。这些通常具有用于“确保此文件在远程系统上”和“在某个远程系统上启动此容器”的内置工具。我不建议使用 Docker Machine,除非在需要本地 VM 来运行 Docker 的特定情况下(通常通过 Docker Toolbox 应用程序,在 Windows 7 或其他没有“本机”Docker 应用程序的环境中可以使用) .

    【讨论】:

    • 谢谢大卫!好的,这是有道理的。但是就没有别的办法了吗?我现在尝试的是,我没有将它安装到远程容器,而是创建了一个 Dockerfile 并尝试复制我的内容:FROM nginx COPY ./compose/production/nginx/hbe.conf /etc/nginx/conf.d/default.conf 这给了我错误nginx: [emerg] host not found in upstream "django" 我知道我应该为此提出一个单独的问题,但你是说用 docker-machine 完全不可能实现我想要的?还是将其复制到 dockerfile 中?
    • 如果你可以让你的镜像在本地工作而根本没有volumes:(或者只使用具有默认存储的命名卷;绝对没有对主机路径的引用)那么你应该能够让它工作以您描述的方式也使用远程 Docker。 (我仍然建议使用专门构建的远程系统自动化工具。)
    • 谢谢,这个解释真的帮了我大忙。我让它工作将我的配置复制到我的服务器。我认为这比 ssh 进入我的机器要好得多,因为我的配置不会经常更改。我部署的代码每天都在变化。所以我现在可以用一个命令进行部署。否则,我将不得不将整个代码再次复制到我的服务器。 (我不能从 gitlab 中提取它,因为它位于私有实例上)。你是对的,我可能应该为此使用一个工具,但我现在正试图将我的堆栈保持在最低限度。但是到时候我会研究这些工具的,再次非常感谢!!
    猜你喜欢
    • 2018-02-08
    • 2019-04-19
    • 2023-01-03
    • 2021-02-17
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2022-06-28
    • 2018-10-10
    相关资源
    最近更新 更多