如何在dockerfile中使用cp命令

1wnzp6jl  于 2023-01-01  发布在  Docker
关注(0)|答案(3)|浏览(994)

我想减少我的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
sdnqo3pr

sdnqo3pr1#

你不能这么做。
COPY从主机拷贝到映像。
RUN cp从映像中的一个位置复制到映像中的另一个位置。
要将所有内容放入一个COPY语句中,您可以在主机上创建所需的文件结构,然后使用tar将其变为一个文件。然后,当您使用COPYADD将tar文件解压缩时,Docker将其解压缩并将文件放入正确的位置。但对于您的文件在主机上的当前结构,不可能在一个COPY命令中完成。

ffvjumwh

ffvjumwh2#

问题

COPY用于将文件从主机复制到容器。因此,当您运行

COPY ./dependencies/file1 /root/.m2
COPY ./dependencies/file2 /root/.sbt/
COPY ./dependencies/folder1 /root/.ivy2/cache

Docker将在您的主机上查找file1file2folder1
但是,当您使用RUN执行时,命令在容器内执行,./dependencies/file1(等等)还不存在于您的容器中,这会导致file not found错误。
简言之,COPYRUN是不可互换的。

如何修复

如果您不想使用多个COPY命令,可以使用一个COPY将所有文件从主机复制到容器,然后使用RUN命令将它们移动到适当的位置。
要避免复制不必要的文件,请使用. dockerignore。例如:

  • .停靠忽略*
./dependencies/no-need-file
./dependencies/no-need-directory/
    • 停靠文件**
COPY ./dependencies/ /root/
RUN mv ./dependencies/file1 /root/.m2 && \
    mv ./dependencies/file2 /root/.sbt/ && \
    mv ./dependencies/folder1 /root/.ivy2/cache
iibxawm4

iibxawm43#

/root/.ivy2/cache/中缺少最后一个斜杠

相关问题