docker 纯粹从命令行构建

sam*_*ime 7 docker dockerfile

有没有办法完全从命令行构建 docker 容器?也就是说,我需要能够设置诸如FROMRUN和 之类的东西CMD

我的场景是,我必须使用 docker 容器来运行所有内容(gitnpm等),并且我想动态构建已完成准备工作的容器(例如npm install已经运行的容器)。

有很多不同的情况,Dockerfile为每个情况创建一个实际的情况就太过分了。我希望能够在我的脚本中创建命令行命令。

BMi*_*tch 10

2017-05-05 更新:Docker 刚刚发布了 17.05.0-ce,其中包含此PR #31236。现在上面的命令创建了一个图像:

$ docker build -t test-no-df -f - . <<EOF
FROM busybox:latest
CMD echo just a test
EOF
Sending build context to Docker daemon  23.34MB
Step 1/2 : FROM busybox:latest
 ---> 00f017a8c2a6
Step 2/2 : CMD echo just a test
 ---> Running in 45fde3938660
 ---> d6371335f982
Removing intermediate container 45fde3938660
Successfully built d6371335f982
Successfully tagged test-no-df:latest
Run Code Online (Sandbox Code Playgroud)

可以通过以下命令在一行中实现相同的效果:

$ printf 'FROM busybox:latest\nCMD echo just a test' | docker build -t test-no-df -f - .
Run Code Online (Sandbox Code Playgroud)

原始回应

docker build要求 Dockerfile 是一个实际文件。您可以使用不同的文件名:

docker build -f Dockerfile.temp .
Run Code Online (Sandbox Code Playgroud)

它们允许通过标准输入传递构建上下文(也称为.当前目录),但尝试使用此语法传递 Dockerfile 将失败:

$ docker build -t test-no-df -f - . <<EOF
FROM busybox:latest
CMD echo just a test
EOF

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/bmitch/data/docker/test/-: no such file or directory
Run Code Online (Sandbox Code Playgroud)