WORKDIR $HOME 无法正常化任何内容

WORKDIR $HOME cannot normalize nothing

我是 docker 的新手。我有一个非常简单的 Dockerfile 但是当我尝试从这个 Docker 文件构建图像时,我得到“无法正常化任何东西”错误。

FROM alpine:latest
RUN apk add vim
CMD ["bash"]
WORKDIR $HOME

为了构建图像,我使用以下命令:

$ docker build -t aamirglb/test:1.0 .

我使用 Play With Docker (PWD) 来测试这个脚本,这里是输出。

pwd output

如果我注释掉 WORKDIR $HOME 行,则构建成功。

如能帮助理解此错误,我们将不胜感激。

提前致谢。

对于那些无法重现的,buildkit不会出现这个错误:

$ docker build -t test-workdir -f df.workdir-empty .
[+] Building 0.2s (6/6) FINISHED                                                                                                                                                                                   
 => [internal] load build definition from df.workdir-empty                                                                                                                                                    0.0s
 => => transferring dockerfile: 43B                                                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                                                             0.0s
 => => transferring context: 34B                                                                                                                                                                              0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                                                                              0.0s
 => [1/3] FROM docker.io/library/alpine:latest                                                                                                                                                                0.0s
 => CACHED [2/3] RUN apk add vim                                                                                                                                                                              0.0s
 => exporting to image                                                                                                                                                                                        0.0s
 => => exporting layers                                                                                                                                                                                       0.0s
 => => writing image sha256:cadafef9a77c95b1b32499bcc1beba016ff0a7071710a1c37eb4e5f32e5d1c94                                                                                                                  0.0s
 => => naming to docker.io/library/test-workdir                                                                                                                                                               0.0s

但是如果你用经典构建器构建,确实会出现错误:

$ DOCKER_BUILDKIT=0 docker build -t test-workdir -f df.workdir-empty .                                    
Sending build context to Docker daemon  23.04kB                                                          
Step 1/4 : FROM alpine:latest                                                                            
 ---> 14119a10abf4
Step 2/4 : RUN apk add vim
 ---> Running in a286e7f3107a
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
(1/5) Installing xxd (8.2.4708-r0)
(2/5) Installing lua5.3-libs (5.3.6-r0)
(3/5) Installing ncurses-terminfo-base (6.2_p20210612-r0)
(4/5) Installing ncurses-libs (6.2_p20210612-r0)                                                         
(5/5) Installing vim (8.2.4708-r0)
Executing busybox-1.33.1-r3.trigger
OK: 26 MiB in 19 packages
Removing intermediate container a286e7f3107a
 ---> acdd6e1963db
Step 3/4 : CMD ["bash"]
 ---> Running in 6deb306db96a
Removing intermediate container 6deb306db96a
 ---> 960f0de2f376
Step 4/4 : WORKDIR $HOME
cannot normalize nothing

在您抱有希望之前,buildkit 示例中的 workdir 未设置为用户的主目录:

$ docker inspect test-workdir:latest --format '{{.Config.WorkingDir}}'
/

那么首先,cannot normalize nothing是什么意思?规范化是将 /.//some/../path 之类的路径转换为 ​​/path 的过程,清除字符串中不需要的内容并将其转换为统一路径。该过程不起作用,它需要一个字符串或值,或者至少经典构建器需要(buildkit 似乎有一个合理的默认值)。

为什么 $HOME 不默认为 /root?因为该变量从未在 docker 中设置。里面唯一定义的环境变量有一个路径:

$ docker inspect test-workdir:latest --format '{{.Config.Env}}'
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

当您在容器中启动 shell 类似 /bin/sh 时,shell 就是定义 $HOME 和各种其他变量的内容:

$ docker run -it --rm test-workdir /bin/sh
/ # env
HOSTNAME=c68d4370e413
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

由于没有ENVARG设置$HOME,所以不能在WORKDIR步骤中使用。