在Docker构建中如何使用COPY命令?

7
我正在尝试进行一些自动化操作来构建我的Docker镜像。以下是我在Windows 8、Kitematic和Virtual Box中运行的代码:
FROM node:6

# Create directory
RUN mkdir -p /tempDir && mkdir -p /tempDir/built && mkdir -p /data

# Setup build environment
COPY . /tempDir
RUN npm install -g gulp typings 

# Build from source
WORKDIR /tempDir 
RUN npm install && typings install && gulp build 

到目前为止,一切都很好,在/tempDir/built目录中成功构建了我的TypeScript到JavaScript。我进入容器,它看起来像这样:

tempDir/gulpfile.js
tempDir/typings
tempDir/src 
tempDir/built

我的下一步是将这个构建的文件夹移动到另一个目录,然后删除tempDir。我的问题是COPY命令的工作方式不如我预期那样。

COPY built/* /data/

我一直遇到像“没有这个文件或目录”或“lstat built/: 没有这个文件或目录”的错误。 我尝试过./built、./built/、built/、/tempDir/built/等,但仍然收到相同的错误提示。 有人能帮忙解决吗?


在Dockerfile的顶部,您不必每次都重复mkdir。一个命令就足够了:RUN mkdir -p /tmpDir/built /data - drs
2个回答

6

COPY 命令可以将文件从主机文件系统复制到容器中。看起来你想要将容器中的一个目录中的文件复制到另一个目录中。为此,你需要使用 RUNcp 命令。

RUN cp -r built/* /data/

由于您将删除/tempDir/目录,因此可以通过重命名该目录来加快速度:

RUN mv built /data

这样你就不需要复制数据再删除原始数据。

感谢您启示COPY的用法,但我仍然遇到了“命令'/bin/sh -c cp built/* /data/'返回非零代码:1”的错误,请问您有什么想法? - Simon
可能是因为你在 /built 目录下有子目录,而我没有考虑到。正如 Mike Tung 在下面指出的那样,请尝试使用 RUN cp -r built/* /data/. - drs
你实际上不需要 *,它会被 rf 自动处理。 - Mike Tung
@MikeTung我喜欢*.因为它使操作更加明确。始终遵循这个惯例,您就不必记住cpmvrsync之间的微小差异。 - drs

3

您正在尝试复制容器中的某些内容,因此COPY将无法工作,因为它仅适用于主机->容器。

相反,您将需要在容器内运行bash命令。

RUN cp -rf built /data/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接