将自定义二进制文件添加到Docker容器路径

时间:2017-12-14 17:17:04

标签: ubuntu docker docker-compose

我想将一个自定义二进制可执行文件添加到其中一个容器中。我已在我的机器上制作并尝试添加它。起初我考虑将某个目录安装为/tmp/foo,然后将其复制到/usr/bin/。不是很好,但应该做的伎俩。为此,我在docker-compose.yml中定义了以下卷安装:

volumes:
  - ./var/bin/:/tmp/bin/

以及Dockerfile中的以下命令:

RUN ls /tmp/bin

RUN cp /tmp/bin/wkhtmltoimage /usr/local/bin/ && cp /tmp/bin/wkhtmltopdf /usr/local/bin/

正如你所看到的,我已经添加了列表目录,以检查是否有任何内容,我有

ls: cannot access /tmp/bin: No such file or directory
ERROR: Service 'web' failed to build: The command '/bin/sh -c ls /tmp/bin' returned a non-zero code: 2

现在,有两个问题:

  1. 为什么在容器的命令行中看不到此目录?其他坐骑可用......

  2. 如何“正确”实现这一目标?这样二进制文件在映像构建期间会被复制/设置一次,并且不需要在每个容器运行时映射?

1 个答案:

答案 0 :(得分:2)

  

为什么这个目录在容器的命令行中不可见?其他坐骑可用......

因为在您构建容器时尚未安装绑定装载卷。您正在使用docker-compose.yml在运行时挂载卷,类似于

docker run -v $(pwd)/var/tmp:/tmp/bin myimage/myimage

但是,在docker-compose安装卷之前,你在构建期间尝试访问/ tmp / bin。

  

我怎样才能实现这个目标"正确"?这样二进制文件在构建图像时会被复制/设置一次,并且不需要在每个容器运行时进行映射吗?

使用一对ADD命令替换Dockerfile提供的两个RUN命令:

ADD ./var/bin/wkhtmltopdf /usr/local/bin
ADD ./var/bin/wkhtmltoimage /usr/local/bin

这将从您的主机获取文件并将它们直接放入图像中。这是做你想做的事的正确方法。