Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Docker在macOS和Ubuntu上构建我的Rust程序时会产生不同的图像?这是Docker的一个bug吗?_Macos_Docker_Ubuntu_Rust_Dockerfile - Fatal编程技术网

为什么Docker在macOS和Ubuntu上构建我的Rust程序时会产生不同的图像?这是Docker的一个bug吗?

为什么Docker在macOS和Ubuntu上构建我的Rust程序时会产生不同的图像?这是Docker的一个bug吗?,macos,docker,ubuntu,rust,dockerfile,Macos,Docker,Ubuntu,Rust,Dockerfile,下面是我的简单生锈程序: use std::time::SystemTime; fn main() { let now = SystemTime::now(); println!("{:?}", now); } 这是我的Dockerfile: FROM rust:1.50 as builder WORKDIR /usr/src RUN cargo new --bin playground WORKDIR /usr/src/playground COPY C

下面是我的简单生锈程序:

use std::time::SystemTime;

fn main() {
    let now = SystemTime::now();
    println!("{:?}", now);
}
这是我的Dockerfile:

FROM rust:1.50 as builder
WORKDIR /usr/src
RUN cargo new --bin playground
WORKDIR /usr/src/playground
COPY Cargo.toml .
COPY Cargo.lock .
RUN cargo build --release
RUN rm -rf src
COPY src src
RUN cargo build --release

FROM ubuntu:18.04
COPY --from=builder /usr/src/playground/target/release/playground /usr/local/bin/playground
CMD [ "playground" ]
我的生成器映像包含
cargo build--release
两次,因为它第一次构建依赖项,第二次构建可执行文件。我知道上面的简单程序没有外部依赖项,但这是我通常使用的设置,当我的
src
代码发生更改但我的
Cargo.toml
没有更改时,它会大大加快Docker的构建速度(它在几秒钟内构建,而不是几分钟)

然而,与Ubuntu相比,我在macOS上运行docker build和docker运行时得到的结果完全不同

在macOS上,我获取系统时间,例如:

SystemTime { tv_sec: 1614652600, tv_nsec: 426791496 }
在Ubuntu上,我得到默认的Rust程序输出:

Hello, world!
在Ubuntu上构建时,第一个
cargo-build--release
生成的可执行文件被缓存,这样第二个
cargo-build--release
就不会做任何事情(同时它在macOS上重建可执行文件)我不确定什么是“正确的”行为,但据我所知,Docker在两个不同的操作系统上构建相同的东西时不应该生成不同的映像?这是Docker的一个缺陷还是我根本误解了Docker的工作原理?

有趣的是,只有当我使用某种东西时才会发生这种情况。如果我将生锈程序更改为:

fn main() {
    println!("CHANGED!");
}
然后我得到
你好,世界。请注意,如果我通过在第二次
运行cargo build--release
之前添加
运行cargo clean
来解决问题,我可以在两个操作系统上获得一致的行为。但是,我仍然认为,如果没有此修复,我会得到不同的图像,这是有问题的


请注意,我在Docker Desktop 3.1.0版中使用macOS Catalina 10.15.7版,在Docker 19.03.6版中使用Ubuntu 18.04.4。

在与同事讨论后,我更确信这是Docker Desktop for macOS的一个bug,因此我在这里提出了一个问题:。如果我错了,请告诉我!