我正在尝试为名为“ diesel-cli”的工具创建一个Dockerfile。 Diesel是Rustlang的ORM和查询生成器,这是他们自己的CLI工具。我想在Docker中进行设置,因为如果数据库也是如此,则将DB CLI工具Docker化是很有意义的。该工具本身并不重要。
我在首选的最终环境(Alpine Linux)中实际执行该工具时遇到一些问题,错误是:/bin/sh: diesel: not found
。
从下面的Dockefile中可以看到,最新的Rust Docker映像用于安装该工具并检索可执行文件。然后将可执行文件传输到Alpine映像,这将是最终环境,因为这样可以大大节省映像大小。但是,这会导致上述错误。
但是,如果我完全跳过阿尔卑斯阶段,则不会出现此错误。假设我将FROM
和COPY
注释掉了,根本没有问题。我可以按预期构建并调用该工具。但是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 ...
进行访问(假设图像被标记为“柴油”)。
答案 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"]