扩展本地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