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=/
由于没有ENV
或ARG
设置$HOME
,所以不能在WORKDIR
步骤中使用。
我是 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=/
由于没有ENV
或ARG
设置$HOME
,所以不能在WORKDIR
步骤中使用。