扩展本地Dockerfile

Pie*_*NAY 21 docker

我试图Dockerfile建立另一个本地的.

$ ls -lR
total 0
-rw-r--r--  1 me     me      42 14 avr 10:42 Dockerfile
drwxr-xr-x  3 me     me      42 14 avr 10:42 prod

./prod:
total 0
-rw-r--r--  1 me     me      42 14 avr 10:42 Dockerfile

$ cat prod/Dockerfile
FROM ../Dockerfile
...

$ docker build - < prod/Dockerfile
Run Code Online (Sandbox Code Playgroud)

无法处理Dockerfile:无法解析存储库信息:存储库名称组件必须匹配"a-z0-9 (?:[._] a-z0-9)*"

我知道FROM期待图像而不是路径.

如何延长Dockerfileprod/Dockerfile

tha*_*tah 14

Dockerfiles不会扩展Dockerfiles而是扩展图像,该FROM行不是"include"语句.

因此,如果要"扩展"另一个Dockerfile,则需要将原始Dockerfile构建为图像,并扩展该图像.

例如;

Dockerfile1:

FROM alpine
RUN echo "foo" > /bar
Run Code Online (Sandbox Code Playgroud)

Dockerfile2:

FROM myimage
RUN echo "bar" > /baz
Run Code Online (Sandbox Code Playgroud)

构建第一个Dockerfile(因为它被调用Dockerfile1,使用-f选项作为docker默认来查找一个名为的文件Dockerfile),并将其"标记"为myimage

docker build -f Dockerfile1 -t myimage .

# Sending build context to Docker daemon 3.072 kB
# Step 1 : FROM alpine
#  ---> d7a513a663c1
# Step 2 : RUN echo "foo" > /bar
#  ---> Running in d3a3e5a18594
#  ---> a42129418da3
# Removing intermediate container d3a3e5a18594
# Successfully built a42129418da3
Run Code Online (Sandbox Code Playgroud)

然后构建第二个Dockerfile,它扩展您刚刚构建的图像.我们将生成的图像标记为"myextendedimage";

docker build -f Dockerfile2 -t myextendedimage .

# Sending build context to Docker daemon 3.072 kB
# Step 1 : FROM myimage
#  ---> a42129418da3
# Step 2 : RUN echo "bar" > /baz
#  ---> Running in 609ae35fe135
#  ---> 4ea44560d4b7
# Removing intermediate container 609ae35fe135
# Successfully built 4ea44560d4b7
Run Code Online (Sandbox Code Playgroud)

要检查结果,请从映像运行容器并验证两个文件(/bar/baz)是否在映像中;

docker run -it --rm myextendedimage sh -c "ls -la ba*"

# -rw-r--r--    1 root     root             4 Apr 14 10:18 bar
# -rw-r--r--    1 root     root             4 Apr 14 10:19 baz
Run Code Online (Sandbox Code Playgroud)

我建议阅读用户指南,该指南解释了如何使用图像和容器

  • 谢谢,我知道`FROM`需要一个图像而不是`Dockerfile`路径(正如我在我的问题中所说).我想知道如何扩展`Dockerfile`以改善环境配置的可维护性.但我现在有了答案:不,你不能:) (2认同)

edr*_*evo 9

如果您使用 Docker 20.10+,您可以执行以下操作:

# syntax = edrevo/dockerfile-plus

INCLUDE+ ../Dockerfile

RUN ...
Run Code Online (Sandbox Code Playgroud)

INCLUDE+指令由 Dockerfile 中的第一行导入。您可以在https://github.com/edrevo/dockerfile-plus阅读有关 dockerfile-plus 的更多信息