由Bazel创建的Docker镜像没有存储库/标记,文件包含奇怪的名称并且不运行

时间:2017-02-15 05:43:37

标签: docker bazel

我正在尝试使用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映像作为基础?)。回顾一下:

  1. 将Bazel生成的图像导入Docker后,不会显示存储库/标记名称。
  2. hello文件已添加到名称为o
  3. 的图片中
  4. 即使以o运行,Dockered可执行文件也会产生“错误的文件描述符”消息。
  5. 我的软件版本:

    $ 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
    

0 个答案:

没有答案