扩展本地Dockerfile

我试图在另一个本地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 

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

我知道FROM期望图像而不是path。

如何从prod/Dockerfile扩展prod/Dockerfile

Dockerfiles不扩展Dockerfiles而是图像FROM行不是“include”语句。

所以,如果你想“扩展”另一个Dockerfile,你需要将原始的Dockerfile构build为一个图像,并扩展该图像。

例如;

Dockerfile1:

 FROM alpine RUN echo "foo" > /bar 

Dockerfile2:

 FROM myimage RUN echo "bar" > /baz 

构build第一个Dockerfile(因为它被称为Dockerfile1 ,使用-f选项作为Dockerfile1默认查找名为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 

然后构build第二个Dockerfile,它扩展了您刚刚构build的图像。 我们将生成的图像标记为“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 

要检查结果,从图像运行一个容器,并validation这两个文件( /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 

我build议阅读用户指南 ,其中介绍了如何使用图像和容器

我为此写了简单的bash脚本。 它的工作方式如下:示例结构:

 | |_Dockerfile(base) |_prod |_Dockerfile(extended) 

Dockerfile(扩展):

 FROM ../Dockerfile ... 

运行脚本:

 ./script.sh prod 

它将您的基本dockerfile与扩展并生成合并文件合并。 脚本:

 #!/bin/bash fromLine=$(head -n 1 $1/Dockerfile) read -a fromLineArray <<< $fromLine extPath=${fromLineArray[1]} tail -n +2 "$1/Dockerfile" > strippedDocker cat $1/$extPath strippedDocker > resDocker rm strippedDocker docker build - < resDocker rm resDocker