【问题标题】:docker-compose up with volumes "no such file or directory"docker-compose up 卷“没有这样的文件或目录”
【发布时间】:2018-03-25 16:46:54
【问题描述】:

我是使用 docker 尤其是 docker compose 的初学者。目前,在创建我最初的简单 docker 环境时,我遇到了第一个错误,我不知道为什么。 我试图在 stackoverflow 中寻找解决方案,但没有发现任何可以帮助我的东西。 使用“docker-compose up”启动我的 docker,我收到以下错误:

$ docker-compose up
删除 errorinstance_app_1
重新创建 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 ...
重新创建 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 ... 错误
错误:对于 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 无法启动服务应用程序:oci 运行时错误:container_linux.go:265:启动容器进程导致“exec:\”./run.sh\“:stat ./run.sh:没有这样的文件或目录” 错误:对于应用程序无法启动服务应用程序:oci 运行时错误:container_linux.go:265:启动容器进程导致“exec:\”./run.sh\“:stat ./run.sh:没有这样的文件或目录” 错误:启动项目时遇到错误。

所以。按照我的文件夹结构:

  • 项目
    • docker-compose.yml
    • 码头工人
      • Java
        • Dockerfile
    • 源代码
      • run.sh

按照我的 docker-compose.yml:

 version: '2'
    services:
      app:
        build:
            dockerfile: ./Docker/Java/Dockerfile
            context: .
        volumes:
            - ./src:/usr/local/etc/
        working_dir: /usr/local/etc/
        command: ./run.sh

并关注我的 docker 文件:

FROM java:7-jdk-alpine
# WORKDIR /usr/local/etc

运行.sh

echo "Hello world."

是的,我知道我只能在 docker-compose 文件中执行该解决方案。但将来我需要扩展 Dockerfile。

有人可以分别帮助我有没有人看到这个问题?

【问题讨论】:

  • 能否请您更改命令:/bin/bash,然后检查/usr/local/etc/目录中是否存在该脚本以及它具有哪些权限?
  • 注释掉命令,开始一个 bash 会话。一旦进入你应该在你提到的工作目录中......另外,检查@Sergiu提到的执行权限
  • 更改命令我得到一个“未找到”异常。直接在 Dockerfile "/bin/sh: bash: not found" 中使用该命令。在 docker-compose 文件中包含该命令“错误:对于 java 无法启动服务应用程序:oci 运行时错误:container_linux.go:265:启动容器进程导致“exec:\”/bin/bash\”:stat /bin/bash:没有这样的文件或目录”。也只尝试了“bash”
  • 将 CMD /bin/bash 直接添加到 dockerfile 并运行 docker run -it /bin/bash。有用。但是为什么不能从 docker-compose 文件中运行 bin/bash 命令呢?

标签: bash docker docker-compose


【解决方案1】:

问题在于您在 dockerfile 中使用的基本 docker 映像:

FROM java:7-jdk-alpine

您正在尝试通过运行run.sh bash 脚本来启动容器。但是上图不支持bash本身

作为参考,您可以在 docker hub 页面here 中查看上图的文档。在这里引用必要的部分:

java:alpine

...

为了最小化图像大小,额外的相关工具并不常见 (例如 git 或 bash)被包含在基于 Alpine 的图像中。使用 以此图像为基础,在自己的 Dockerfile 中添加你需要的东西 (有关如何安装的示例,请参阅 alpine 图像描述 不熟悉的包)。

这就是问题所在。

现在,我可以想到 2 个解决方案:

  1. 只需使用java:7-jdk 作为基础镜像而不是java:7-jdk-alpine
  2. 通过将 dockerfile 更改为:在基础映像 java:7-jdk-alpine 之上安装 bash

    FROM java:7-jdk-alpine
    RUN apk update && apk upgrade && apk add bash
    #WORKDIR /usr/local/etc
    

    *在 alpine linux 中安装 bash 的步骤来源是here

【讨论】:

    【解决方案2】:

    看起来 docker compose 找不到您的 run.sh 文件。此文件需要包含在您的 docker 映像中。

    将您的 Dockerfile 更改为以下内容,然后使用 docker build -t <YOUR_IMAGE_NAME> . 重建映像。

    FROM java:7-jdk-alpine
    ADD run.sh /usr/local/etc/run.sh
    

    重建映像后,再次运行docker-compose up

    【讨论】:

    • 非常感谢您的帮助。有一个问题。我的理解是,docker-compose 中的“volumes”设置应该将文件映射到图像中,这样我就不需要添加任何文件?
    • docker-compose volumes 将文件映射到正在运行的容器(即在容器运行时的运行时),而不是映像。在您的 docker-compose 配置中,您说的是“启动容器时运行 run.sh 脚本”,但 run.sh 不存在,因为它不是图像的一部分。 run.sh 文件需要在构建时添加。
    • 嗯,好的。很高兴知道。因此,假设我有多个由 run.sh 触发的文件。我需要“添加”所有这些文件吗?您对我有“最佳实践”吗?我可以如何以干净的方式处理它?对于开发,我的源文件夹(包括 java 文件)很大(几 GB),每次都添加所有新文件,分别构建 docker 映像总是新的。
    • 您可以只添加整个目录,这样您就不必在 Dockerfile 中执行多个 ADD 语句。由于您已经有一个卷可以将本地开发文件夹 src/ 映射到 /usr/local/etc/,因此您不必在每次代码更改后重新构建映像。您只需在部署到 DEV、QA 或 PROD 环境时进行重建。
    【解决方案3】:

    解决问题的最简单方法是在容器中执行一个 bash 会话,然后在容器内部,您必须检查文件是否存在于 如果文件不在路径中,则必须在将图像创建到 docker 文件中或通过 de docker-compose 中的卷创建时将其包含在内。

    要检查的另一件事是您使用的相对路径。当您检查 de docker 容器内的文件是否存在时会很清楚

    docker exec -it CONTAINER_NAME bash

    我建议你在 docker compose 文件中创建一个卷,因为它是更简单的方法,也是最好的方法。

    有个问题想请教你,你为什么要把Dockerfile文件放在Java路径里面?

    遵循指南不是一个好主意 正确的做法是把你的dockerfile文件放到环境文件夹中,这样dockerfile文件就和你应用的java源码没有关系了

    【讨论】:

    • 感谢您的回复。我还有以下其他问题:如何运行 docker exec -it CONTAINER_NAME bash?目前我的 docker-compose 正在抛出未找到文件的错误,因此我没有可以运行此命令的运行实例。拥有环境文件夹是什么意思?你能给我举个例子吗?非常感谢。
    【解决方案4】:

    我经常遇到这个错误,经过大量调查,看起来有些图像已损坏。

    删除这些并重建可以解决问题。这不是 docker 安装或配置本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2021-09-28
      • 2019-04-01
      • 2018-08-07
      相关资源
      最近更新 更多