我正在尝试使用Bazel将使用Bazel编译的应用程序打包到Docker镜像中。
我有一个空的WORKSPACE
文件,以下main.cc
文件:
#include <stdio.h>
int main() { printf("Hello World\n"); }
和以下BUILD文件(全部在同一个文件夹中):
load("@bazel_tools//tools/build_defs/docker:docker.bzl", "docker_build")
cc_binary(
name = "hello",
srcs = ["main.cc"],
)
docker_build(
name = "hello_docker",
files = [":hello"],
cmd = ["./hello"],
)
Gist可用here。
当我运行bazel run :hello
时,我可以看到“Hello World”已成功打印。然后我运行bazel build :hello_docker.tar
is supposed以生成bazel-bin/hello_docker.tar
中泊坞窗的完整图像。看起来确实如此。
然后我跑:
$ docker load -i bazel-bin/hello_docker.tar
51525b594688: Loading layer [==================================================>] 10.24 kB/10.24 kB
Loaded image ID: sha256:252367f43640968343ecd78b2a3533c8ed99c4be66d73fc3ec6ccb137df19625
然后我列出所有图像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 b969ab9f929b 3 weeks ago 188 MB
docker/whalesay latest 6b362a9f73eb 21 months ago 247 MB
<none> <none> 252367f43640 292 years ago 8.048 kB
看起来刚刚加载的图像没有任何与之关联的存储库或标记。为什么会这样,我该如何解决? “创建”值非常大(Bazel清除了可重现性的时间戳)。
当我查看hello_docker.tar
内部时,我会在repository
文件中看到与预期存储库/标记相关的内容:
{
"bazel/": {
"hello_docker": "3d529b3ceeb0d9ef33f6225e655f3f5a0e061888f25cd6a3fac11604778ef6a8"
}
}
另一个问题:当我尝试在新容器中运行图像时,它会失败:
$ docker run -t -i 25236
docker: Error response from daemon: oci runtime error: exec: "./hello": stat ./hello: no such file or directory.
我再次查看生成的tar
文件,发现这里有可执行文件,但由于某种原因它被命名为o
。另一种尝试和不同的错误:
$ docker run -t -i 25236 ./o
write pipe: bad file descriptor
奇怪的是,如果我用这样的hello
打包Dockerfile
可执行文件,那么“Hello World”会按预期打印出来:
FROM ubuntu:14.04
ADD hello .
CMD ./hello
有人可以建议如何修复这三个问题中的任何一个吗?我认为它们是互连的,我有错误的BUILD文件(也许我应该以某种方式指定使用哪个Linux映像作为基础?)。回顾一下:
hello
文件已添加到名称为o
。o
运行,Dockered可执行文件也会产生“错误的文件描述符”消息。我的软件版本:
$ bazel version
Build label: 0.4.4
Build target: bazel-out/local-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Feb 1 18:54:21 2017 (1485975261)
Build timestamp: 1485975261
Build timestamp as int: 1485975261
$ docker version
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.2
Git commit: 6b644ec
Built: Mon, 19 Dec 2016 09:20:48 +1300
OS/Arch: linux/amd64
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.2
Git commit: 6b644ec
Built: Mon, 19 Dec 2016 09:20:48 +1300
OS/Arch: linux/amd64