2017-10-13 49 views
0

我是一个初学者与码头工作,尤其是码头工作。目前,创建我最初的简易码头环境,我遇到了第一个错误,我不知道为什么。 我试图在stackoverflow中搜索解决方案,但没有发现任何可以帮助我的解决方案。 开始我和泊坞窗“泊坞窗,撰写了”我得到以下错误:码头 - 组成卷“没有这样的文件或目录”

$ docker-compose up
Removing errorinstance_app_1
Recreating 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 ...
Recreating 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 ... error
ERROR: for 8a358dfcb306_8a358dfcb306_8a358dfcb306_errorinstance_app_1 Cannot start service app: oci runtime error: container_linux.go:265: starting container process caused "exec: \"./run.sh\": stat ./run.sh: no such file or directory"
ERROR: for app Cannot start service app: oci runtime error: container_linux.go:265: starting container process caused "exec: \"./run.sh\": stat ./run.sh: no such file or directory"
ERROR: Encountered errors while bringing up the project.

所以。继我的文件夹结构:

  • 项目
    • 泊坞窗,compose.yml
    • 泊坞
      • 的Java
        • Dockerfile
    • SRC
      • run.sh

关注荷兰国际集团我的搬运工,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 

而继我的搬运工文件:

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

run.sh

echo "Hello world." 

是的,我知道我能做到这一点的解决方案只能在一个docker-compose文件。但在将来我需要扩展Dockerfile。

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

+1

请问您可以更改命令:/ bin/bash,然后检查脚本是否存在于/ usr/local/etc /目录以及它拥有什么权限? – Sergiu

+0

注释掉这个命令,开始一个bash会话。一旦进入,你应该在你提到的工作目录中......另外,请检查执行权限是否为@Sergiu – sebagomez

+0

更改命令我收到“找不到”异常。直接在Dockerfile“/ bin/sh:bash:not found”中执行该命令。在docker-compose文件中有该命令“ERROR:for java无法启动服务应用程序:oci运行时错误:container_linux.go:265:启动容器进程导致”exec:\“/ bin/bash \”:stat/bin/bash:没有这样的文件或目录“。也试过只有”bash“ – SNO

回答

1

的问题是您使用的是dockerfile基础泊坞窗图像:试图通过运行run.sh bash脚本启动容器

FROM java:7-jdk-alpine 

。但上述图片不支持bash本身

作为参考,您可以在码头集线器页面here中看到上述图片的文档。在这里引用必要的部分:

java:alpine

...

To minimize image size, it's uncommon for additional related tools (such as git or bash) to be included in Alpine-based images. Using this image as a base, add the things you need in your own Dockerfile (see the alpine image description for examples of how to install packages if you are unfamiliar).

这就是问题所在。通过改变dockerfile到

  1. 只需使用java:7-jdk作为基本图像,而不是java:7-jdk-alpine
  2. 的基本图像java:7-jdk-alpine的顶部安装bash

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

    现在,我能想到的2个解决方案

    *在高山linux中安装bash的步骤源是here

0

它看起来像泊坞窗撰写无法找到您的run.sh文件。该文件需要包含在您的泊坞窗图像中。

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

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

一旦您的图像被重建,再次运行docker-compose up

+0

非常感谢您的帮助。在这一点上有一个问题。我的理解是,docker-compose中的“卷”设置应该将这些文件映射到映像中,以便我不需要添加任何文件? – SNO

+0

docker-compose'volumes'将文件映射到正在运行的容器(即运行时容器正在运行时),而不是映像。在你的docker-compose配置中,你说的是“在启动容器时运行'run.sh'脚本”,但是'run.sh'不存在,因为它不是图像的一部分。需要在构建时添加'run.sh'文件。 – grizzthedj

+0

好的。很高兴知道。所以,假设我有多个由run.sh触发的文件。我需要“添加”所有这些文件吗?你对我有没有“最佳实践”,我可以如何以一种干净的方式处理?对于开发我的源文件夹包括java文件是要大(几gb)添加所有文件每次新分别建立码头图像总是新的。 – SNO

0

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

另一件要检查的是你正在使用的相对路径。很显然,当你去查泊坞窗容器内的文件

泊坞窗EXEC -IT CONTAINER_NAME庆典

我建议你创建的泊坞窗撰写文件的卷,因为它是更容易的方式存在,也是最好的方法。

有一个问题,我想要做你,为什么你把Dockerfile文件放到Java路径中?

这不是一个好主意Ø指引,遵循 正确的方法是把你的dockerfile文件到环境中的文件夹,这样的dockerfile文件是不相关的应用程序的Java源

+0

谢谢你的回应。我还有以下问题:如何运行docker exec -it CONTAINER_NAME bash?目前我的docker-compose正在抛出找不到文件的错误,所以我没有运行实例的地方可以运行这个命令。拥有一个环境文件夹意味着什么?你能举个例子吗?非常感谢你。 – SNO

0

我得到了这个错误很多,经过很多调查,它看起来像一些图像已损坏。

删除这些和重建解决问题。它不是码头安装或配置本身。

相关问题