【问题标题】:'docker build' gives error that 'docker run' doesn't. How are they different?'docker build' 给出了 'docker run' 没有的错误。它们有何不同?
【发布时间】:2016-07-20 01:20:14
【问题描述】:

我的项目是这样设置的:

./ -
  Dockerfile
  package.json
  build
    compiled files from frontend and backend directories get put here
  backend
    app.js
  frontend
    frontend files...
  scripts
    startServer.sh
    build.sh

startServer.sh:

docker build ../ --tag myImage

# The build script compiles all my assets and places 
#  them in the top level 'build' directory which i am 
#  trying to link to my docker image so I can recompile 
#  on each file change and have the changes show in the docker image.
./build.sh

docker run --volume /path/to/build/dir:/src/app myImage

Dockerfile:

FROM node:4.4.7
RUN ls src/app

当调用 startServer 脚本中的构建命令时,Dockerfile 中的 RUN 命令给了我这个错误:

ls: cannot access src/app: No such file or directory

如果我将 RUN 更改为 CMD,它不会出错。此外,即使在构建给出该错误之后,它也会完成构建并且 docker run 命令没有给出错误。

  1. “docker build”命令是否真的试图将“build”文件夹添加到启动容器的映像中?还是只是编译一些命令供图像制作时使用?

  2. 如果是后者,如何使一个 Dockerfile 既可用于构建又可用于两种情况下的运行?

我觉得我可能遗漏了 Docker 的一个关键概念,但我浏览了教程和文档并无法解决这个问题。

【问题讨论】:

    标签: node.js docker build compilation


    【解决方案1】:

    节点映像中没有src/app 文件夹,因此这是一个预期错误。节点映像希望您添加自己的/usr/src/app,或者在构建中使用COPY 步骤,或者在构建完成后使用卷映射。

    RUN 提供了一个运行步骤以向生成的构建图像添加层,因此 ls 在那里没有什么意义,因为您没有使用新内容修改图像。

    如果在docker run 的末尾没有传递一个命令,CMD 会给出一个默认的运行命令,所以如果你执行docker run node /bin/bashls src/app CMD 将永远不会运行。这也会在您的构建中的其他步骤之后运行,并且在您可能在容器上运行任何卷之后运行,这将创建此文件夹。

    【讨论】:

    • 我现在明白了。谢谢!
    【解决方案2】:

    当你运行 docker 镜像时,你将数据卷挂载到/src/app

    但在 docker 脚本中,您尝试访问 src/app
    因为默认工作目录不是根目录。您无法访问 src 目录。

    所以,编辑你的 docker 文件到

    FROM node:4.4.7
    RUN ls /src/app
    

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2019-08-09
      相关资源
      最近更新 更多