我正在尝试将 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
unable to process Dockerfile: unable to parse repository info: repository name component must match "a-z0-9(?:[._]a-z0-9)*"
我知道 FROM
需要图像而不是路径。
如何从 prod/Dockerfile
扩展 Dockerfile
?
最佳答案
Dockerfiles 不扩展 Dockerfiles 但 images,FROM
行不是“包含”语句。
因此,如果您想“扩展”另一个 Dockerfile,则需要将原始 Dockerfile 构建为镜像,并扩展该镜像。
例如;
Dockerfile1:
FROM alpine
RUN echo "foo" > /bar
Dockerfile2:
FROM myimage
RUN echo "bar" > /baz
构建第一个 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
然后构建第二个 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
要检查结果,请从镜像运行容器并验证两个文件(/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
我建议阅读 User guide ,它解释了如何使用图像和容器
https://stackoverflow.com/questions/36617904/
相关文章:
docker - 如何将文件作为 docker 命令的参数发送?
macos - docker 的 `net=host` 设置如何工作,我该如何做类似的事情,例如虚拟
ruby-on-rails - 无法运行 rake db :create in Dockerfile
docker - 拉取访问被拒绝的存储库不存在或可能需要 docker login
docker - 如何将 Docker 容器中的目录挂载到主机?
postgresql - Docker 错误 : standard_init_linux. go:1