【问题标题】:Dockerfile COPY places file to an unexpected directoryDockerfile COPY 将文件放置到意外目录
【发布时间】:2018-12-03 17:12:43
【问题描述】:

我在Ubuntu 18.04.1 LTS 使用Docker version 18.09.0, build 4d60db4

Dockerfile

FROM registry.hub.docker.com/verdaccio/verdaccio

RUN echo "whoami" && whoami
RUN echo "echo \$HOME" && echo $HOME
RUN mkdir -p $HOME/my_dir
WORKDIR $HOME/my_dir

COPY ./my_verdaccio.conf.yaml $HOME/my_dir/my_verdaccio.conf.yaml

RUN echo "pwd && ls -la" && pwd && ls -la
RUN echo "echo \$HOME && ls -la \$HOME" && echo $HOME && ls -la $HOME
RUN echo "echo \$HOME/my_dir && ls -la \$HOME/my_dir" && echo $HOME/my_dir && ls -la $HOME/my_dir

CMD $APPDIR/bin/verdaccio --config $HOME/my_dir/my_verdaccio.conf.yaml --listen $PROTOCOL://0.0.0.0:${PORT}

构建输出

$ docker build -t my_test -f Dockerfile.test my_dir/
Sending build context to Docker daemon  1.834MB

Step 1/10 : FROM registry.hub.docker.com/verdaccio/verdaccio
 ---> 721ec0ff4795
Step 2/10 : RUN echo "whoami" && whoami
 ---> Running in 259851ba7eaa
whoami
verdaccio
Removing intermediate container 259851ba7eaa
 ---> 822165aeff40
Step 3/10 : RUN echo "echo \$HOME" && echo $HOME
 ---> Running in f2199c917ed8
echo $HOME
/home/verdaccio
Removing intermediate container f2199c917ed8
 ---> 9fa74aa672ec
Step 4/10 : RUN mkdir -p $HOME/my_dir
 ---> Running in a9072d9bfabb
Removing intermediate container a9072d9bfabb
 ---> 297ba12349fc
Step 5/10 : WORKDIR $HOME/my_dir
 ---> Running in 1966dddaea2e
Removing intermediate container 1966dddaea2e
 ---> 955bb4903b14
Step 6/10 : COPY ./my_verdaccio.conf.yaml $HOME/my_dir/my_verdaccio.conf.yaml
 ---> abcddd168468
Step 7/10 : RUN echo "pwd && ls -la" && pwd && ls -la
 ---> Running in 08a2be791971
pwd && ls -la
/my_dir
total 12
drwxr-xr-x    1 root     root          4096 Dec  3 17:47 .
drwxr-xr-x    1 root     root          4096 Dec  3 17:47 ..
-rw-rw-r--    1 root     root          1927 Dec  3 16:16 my_verdaccio.conf.yaml
Removing intermediate container 08a2be791971
 ---> 10aa4c1774b2
Step 8/10 : RUN echo "echo \$HOME && ls -la \$HOME" && echo $HOME && ls -la $HOME
 ---> Running in 054c7c857d0d
echo $HOME && ls -la $HOME
/home/verdaccio
total 12
drwxr-sr-x    1 verdacci verdacci      4096 Dec  3 17:47 .
drwxr-xr-x    1 root     root          4096 Nov 15 19:58 ..
drwxr-sr-x    2 verdacci verdacci      4096 Dec  3 17:47 my_dir
Removing intermediate container 054c7c857d0d
 ---> fe11c625ee85
Step 9/10 : RUN echo "echo \$HOME/my_dir && ls -la \$HOME/my_dir" && echo $HOME/my_dir && ls -la $HOME/my_dir
 ---> Running in 887cd2eaa002
echo $HOME/my_dir && ls -la $HOME/my_dir
/home/verdaccio/my_dir
total 8
drwxr-sr-x    2 verdacci verdacci      4096 Dec  3 17:47 .
drwxr-sr-x    1 verdacci verdacci      4096 Dec  3 17:47 ..
Removing intermediate container 887cd2eaa002
 ---> 6808c030fa5a
Step 10/10 : CMD $APPDIR/bin/verdaccio --config $HOME/my_dir/my_verdaccio.conf.yaml --listen $PROTOCOL://0.0.0.0:${PORT}
 ---> Running in e4e9a35b36cb
Removing intermediate container e4e9a35b36cb
 ---> 47e25b18af95
Successfully built 47e25b18af95
Successfully tagged my_test:latest

为什么my_verdaccio.conf.yaml 被复制到/my_dir 而不是/home/verdaccio/my_dir

为什么pwd 指向/my_dir,为什么还要创建/my_dir


verdaccio 的 Dockerfile:https://github.com/verdaccio/verdaccio/blob/master/Dockerfile

【问题讨论】:

    标签: docker copy containers dockerfile alpine


    【解决方案1】:

    尝试设置 ENV HOME /root/ <Or your home directory>

    在运行前的dockerfile中RUN mkdir -p $HOME/my_dir

    【讨论】:

      【解决方案2】:

      docker build 不会继承启动它的 shell 的环境变量,因此没有定义 HOME,这从 build 输出中可以看出。

      要在 docker 构建中访问 $HOME,您可以在 Dockerfile 中使用 --build-arg 参数以及 ENVARG。例如,将以下内容添加到您的 Dockerfile:

      ARG home_arg
      ENV HOME=$home_arg
      RUN echo $HOME # test
      

      然后,将--build-arg home_arg=$HOME 添加到 docker build 命令行。

      【讨论】:

      • echo $HOME 返回/home/verdaccio(在容器内)。
      • @DušanMaďar 嗯,您最近的编辑确实更明显,我可能事先错过了它
      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2018-05-26
      • 2020-04-21
      • 1970-01-01
      相关资源
      最近更新 更多