“ / bin / sh”:找不到命令,但仅在第二个构建步骤中

时间:2019-08-11 07:54:15

标签: docker dockerfile

我正在尝试为名为“ diesel-cli”的工具创建一个Dockerfile。 Diesel是Rustlang的ORM和查询生成器,这是他们自己的CLI工具。我想在Docker中进行设置,因为如果数据库也是如此,则将DB CLI工具Docker化是很有意义的。该工具本身并不重要。

我在首选的最终环境(Alpine Linux)中实际执行该工具时遇到一些问题,错误是:/bin/sh: diesel: not found

从下面的Dockefile中可以看到,最新的Rust Docker映像用于安装该工具并检索可执行文件。然后将可执行文件传输到Alpine映像,这将是最终环境,因为这样可以大大节省映像大小。但是,这会导致上述错误。

但是,如果我完全跳过阿尔卑斯阶段,则不会出现此错误。假设我将FROMCOPY注释掉了,根本没有问题。我可以按预期构建并调用该工具。但是Rust映像接近2GB,更不用说包含不必要的依赖关系了,这是不可取的。

使用RUN ls /bin/,我可以确认可执行文件已转移到新环境。为了确保两个映像都以相同的方式运行命令,我从主机上使用了docker ps -l来确认两个映像都使用了/bin/sh -c diesel,因此也没有对其进行解释。

Dockerfile:

FROM rust:latest as builder

RUN cargo install diesel_cli --no-default-features --features postgres

FROM alpine:latest
COPY --from=builder /usr/local/cargo/bin/diesel /bin/diesel

ENV DATABASE_URL postgres://tempest_api:admin@postgres:5432/tempest

CMD diesel

我收到的唯一错误消息是相当无助的/bin/sh: diesel: not found。构建并运行后,目标是使命令可以通过简单的docker run diesel ...进行访问(假设图像被标记为“柴油”)。

2 个答案:

答案 0 :(得分:0)

当我在这里查看时:Rust Docker tutorial,您正在遭受所描述的缺少库的错误。

运行docker run --rm -it myapp ldd /bin/diesel以查看缺少的内容,然后按照其指示在第二个构建步骤中将其复制。

我运行命令并得到:

 /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)
Error loading shared library libpq.so.5: No such file or directory (needed by /usr/local/bin/diesel)
        libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)
        librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/bin/diesel)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /usr/local/bin/diesel)
        libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1c5b5fe000)

这就是您的not found的起源。

答案 1 :(得分:0)

像这样更改您的Dockerfile:

CMD ["/bin/diesel","diesel"]