我想减少我的Dockerfile中使用的层的数量。所以我想把COPY
命令合并到一个RUN cp
中。
- 相依性
- 文件夹1
- 文件1
- 文件2
- 停靠文件
以下命令可以工作,我希望使用单个RUN cp
命令将其合并起来
COPY ./dependencies/file1 /root/.m2
COPY ./dependencies/file2 /root/.sbt/
COPY ./dependencies/folder1 /root/.ivy2/cache
下面的命令说没有这样的文件或目录存在错误。我哪里出错了?
RUN cp ./dependencies/file1 /root/.m2 && \
cp ./dependencies/file2 /root/.sbt/ && \
cp ./dependencies/folder1 /root/.ivy2/cache
3条答案
按热度按时间sdnqo3pr1#
你不能这么做。
COPY
从主机拷贝到映像。RUN cp
从映像中的一个位置复制到映像中的另一个位置。要将所有内容放入一个COPY语句中,您可以在主机上创建所需的文件结构,然后使用
tar
将其变为一个文件。然后,当您使用COPY
或ADD
将tar文件解压缩时,Docker将其解压缩并将文件放入正确的位置。但对于您的文件在主机上的当前结构,不可能在一个COPY命令中完成。ffvjumwh2#
问题
COPY用于将文件从主机复制到容器。因此,当您运行
Docker将在您的主机上查找
file1
、file2
和folder1
。但是,当您使用RUN执行时,命令在容器内执行,
./dependencies/file1
(等等)还不存在于您的容器中,这会导致file not found
错误。简言之,
COPY
和RUN
是不可互换的。如何修复
如果您不想使用多个
COPY
命令,可以使用一个COPY
将所有文件从主机复制到容器,然后使用RUN
命令将它们移动到适当的位置。要避免复制不必要的文件,请使用. dockerignore。例如:
iibxawm43#
/root/.ivy2/cache/
中缺少最后一个斜杠