详解Dockerfile中的copy命令

在编写Dockerfile的时候copy宿主机文件到镜像中,在执行构建的时候报错

guoliang@gldeMacBook-Pro docker_file % docker build -f Dockerfile -t jmeter01 . [+] Building 3.3s (15/16)                                                                                                   => [internal] load build definition from Dockerfile                                                                 0.0s  => => transferring dockerfile: 860B                                                                                 0.0s  => [internal] load .dockerignore                                                                                    0.0s  => => transferring context: 2B                                                                                      0.0s  => [internal] load metadata for docker.io/library/java:8                                                            3.1s  => [auth] library/java:pull token for registry-1.docker.io                                                          0.0s  => [ 1/11] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d    0.0s  => [internal] load build context                                                                                    0.1s  => => transferring context: 2B                                                                                      0.1s  => CACHED [ 2/11] RUN mkdir /jmeterdocker                                                                           0.0s  => CACHED [ 3/11] RUN mkdir -p /jmeterdocker/test                                                                   0.0s  => CACHED [ 4/11] RUN mkdir -p /jmeterdocker/test/input/jmx                                                         0.0s  => CACHED [ 5/11] RUN mkdir -p /jmeterdocker/test/input/testdata                                                    0.0s  => CACHED [ 6/11] RUN mkdir -p /jmeterdocker/test/report/html                                                       0.0s  => CACHED [ 7/11] RUN mkdir -p /jmeterdocker/test/report/jtl                                                        0.0s  => CACHED [ 8/11] RUN mkdir -p /jmeterdocker/test/report/outputdata                                                 0.0s  => CACHED [ 9/11] RUN cd /jmeterdocker                                                                              0.0s  => ERROR [10/11] COPY   ../apache-jmeter-5.4.1.tgz /jmeterdocker                                                    0.0s ------  > [10/11] COPY   ../apache-jmeter-5.4.1.tgz /jmeterdocker: ------ failed to compute cache key: "/apache-jmeter-5.4.1.tgz" not found: not found

看下Dockerfile

FROM java:8  MAINTAINER <qihao@163.com>  ENV http_proxy "" ENV https_proxy ""  RUN mkdir /jmeterdocker RUN mkdir -p /jmeterdocker/test RUN mkdir -p /jmeterdocker/test/input/jmx RUN mkdir -p /jmeterdocker/test/input/testdata RUN mkdir -p /jmeterdocker/test/report/html RUN mkdir -p /jmeterdocker/test/report/jtl RUN mkdir -p /jmeterdocker/test/report/outputdata RUN cd /jmeterdocker  ENV JMETER_VERSION=5.4.1 ENV JMETER_HOME=/jmeterdocker/apache-jmeter-${JMETER_VERSION} ENV JMETER_PATH=${JMETER_HOME}/bin:${PATH} ENV PATH=${JMETER_HOME}/bin:${PATH}  COPY   ../apache-jmeter-5.4.1.tgz /jmeterdocker  RUN cd /jmeterdocker && tar xvf apache-jmeter-5.4.1.tgz && rm apache-jmeter-5.4.1.tgz

可以看到Copy的文件使用的是相对路径(把jmetercopy到镜像的jmeterdocker文件中)

我的jmeter.tgz存放在Docker的上一级目录中。

命令执行后报错提示找不到

failed to compute cache key: "/apache-jmeter-5.4.1.tgz" not found: not found

后来又尝试使用绝对路径更改如下,使用绝对路径

FROM java:8  MAINTAINER <qihao@163.com>  ENV http_proxy "" ENV https_proxy ""  RUN mkdir /jmeterdocker RUN mkdir -p /jmeterdocker/test RUN mkdir -p /jmeterdocker/test/input/jmx RUN mkdir -p /jmeterdocker/test/input/testdata RUN mkdir -p /jmeterdocker/test/report/html RUN mkdir -p /jmeterdocker/test/report/jtl RUN mkdir -p /jmeterdocker/test/report/outputdata RUN cd /jmeterdocker  ENV JMETER_VERSION=5.4.1 ENV JMETER_HOME=/jmeterdocker/apache-jmeter-${JMETER_VERSION} ENV JMETER_PATH=${JMETER_HOME}/bin:${PATH} ENV PATH=${JMETER_HOME}/bin:${PATH}  COPY   /Users/guoliang/Documents/Work/apache-jmeter-5.4.1.tgz /jmeterdocker  RUN cd /jmeterdocker && tar xvf apache-jmeter-5.4.1.tgz && rm apache-jmeter-5.4.1.tgz

build之后报错内容

guoliang@gldeMacBook-Pro docker_file % docker  build -f Dockerfile -t jmeter001 .                                                                  [+] Building 1.2s (14/15)                                                                                                                                => [internal] load build definition from Dockerfile                                                                                              0.0s  => => transferring dockerfile: 177B                                                                                                              0.0s  => [internal] load .dockerignore                                                                                                                 0.0s  => => transferring context: 2B                                                                                                                   0.0s  => [internal] load metadata for docker.io/library/java:8                                                                                         1.1s  => [ 1/11] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d                                 0.0s  => [internal] load build context                                                                                                                 0.0s  => => transferring context: 2B                                                                                                                   0.0s  => CACHED [ 2/11] RUN mkdir /jmeterdocker                                                                                                        0.0s  => CACHED [ 3/11] RUN mkdir -p /jmeterdocker/test                                                                                                0.0s  => CACHED [ 4/11] RUN mkdir -p /jmeterdocker/test/input/jmx                                                                                      0.0s  => CACHED [ 5/11] RUN mkdir -p /jmeterdocker/test/input/testdata                                                                                 0.0s  => CACHED [ 6/11] RUN mkdir -p /jmeterdocker/test/report/html                                                                                    0.0s  => CACHED [ 7/11] RUN mkdir -p /jmeterdocker/test/report/jtl                                                                                     0.0s  => CACHED [ 8/11] RUN mkdir -p /jmeterdocker/test/report/outputdata                                                                              0.0s  => CACHED [ 9/11] RUN cd /jmeterdocker                                                                                                           0.0s  => ERROR [10/11] COPY   /Users/guoliang/Documents/Work/apache-jmeter-5.4.1.tgz /jmeterdocker                                                     0.0s ------  > [10/11] COPY   /Users/guoliang/Documents/Work/apache-jmeter-5.4.1.tgz /jmeterdocker: ------ failed to compute cache key: "/Users/guoliang/Documents/Work/apache-jmeter-5.4.1.tgz" not found: not found

后查询Docker文档,它说不能使用相对路径。

当我将jmeter.tgz文件移动到Dockerfile同目录下在进行build后Dockerfile执行成功。