I'm trying to build a Rust program, which has crates with native dependencies, inside an aarch64 (qemu) container on an amd64 arch host. My docker file includes libssl-dev.
My docker file is:
$ cat Dockerfile
FROM arm64v8/debian:bullseye-slim
# Install utilities
#RUN sed -i 's,//deb,//archive,; /-updates/d' /etc/apt/sources.list
RUN apt-get update
RUN apt-get --quiet install --yes wget tar curl unzip gcc-aarch64-linux-gnu libssl-dev
# Create user "docker"
RUN useradd -m docker && \
cp /root/.bashrc /home/docker/ && \
chown -R --from=root docker /home/docker
ENV HOME /home/docker
WORKDIR ${HOME}/my/local/path
#USER docker
# Install Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH "/home/docker/.cargo/bin:${PATH}"
# Install cargo-deb
RUN cargo install cargo-deb
I run sudo docker build --platform=linux/arm/v8 -t arm64debianbullseye . (successful) and sudo docker run --platform=linux/arm/v8 -v /my/local/path:/my/container/path -it arm64debianbullseye
Inside the container, I run cargo build (as root).
The error is:
Updating crates.io index
Downloaded actix-macros v0.2.4
Downloaded tokio-macros v2.2.0
...
Downloaded actix-codec v0.5.2
Downloaded 114 crates (11.7 MB) in 3.80s (largest was `brotli` at 1.4 MB)
Compiling openssl-sys v0.9.102
Compiling tokio v1.37.0
Compiling futures-util v0.3.30
Compiling serde v1.0.201
Compiling zstd-safe v7.1.0
Compiling actix-router v0.5.2
Compiling env_logger v0.10.2
error: failed to run custom build command for `openssl-sys v0.9.102`
Caused by:
process didn't exit successfully: `/home/docker/my/container/path/target/debug/build/openssl-sys-e86280ee2fd7989a/build-script-main` (exit status: 101)
--- stdout
cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=HOST_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG
cargo:rerun-if-env-changed=OPENSSL_STATIC
cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_PATH_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH
cargo:rerun-if-env-changed=PKG_CONFIG_PATH
cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR
cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
run pkg_config fail:
pkg-config exited with status code 127
> PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags openssl
The system library `openssl` required by crate `openssl-sys` was not found.
The file `openssl.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory.
The PKG_CONFIG_PATH environment variable is not set.
HINT: if you have installed the library, try setting PKG_CONFIG_PATH to the directory containing `openssl.pc`.
--- stderr
thread 'main' panicked at /home/docker/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.102/build/find_normal.rs:190:5:
Could not find directory of OpenSSL installation, and this `-sys` crate cannot
proceed without this knowledge. If OpenSSL is installed and this crate had
trouble finding it, you can set the `OPENSSL_DIR` environment variable for the
compilation process.
Make sure you also have the development packages of openssl installed.
For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.
If you're in a situation where you think the directory *should* be found
automatically, please open a bug at https://github.com/sfackler/rust-openssl
and include information about your system as well as this message.
$HOST = aarch64-unknown-linux-gnu
$TARGET = aarch64-unknown-linux-gnu
openssl-sys = 0.9.102
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
Things I've tried:
Switched from an unprivileged user to being root inside the container, to remove any possible permissions issues.
--- stderr
thread 'main' panicked at /home/docker/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.102/build/main.rs:96:9:
OpenSSL include directory does not exist: /usr/lib/ssl/include
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
There seem to be many unset environment variables. Is there a fault in arm64v8/debian:bullseye-slim or is this a general docker or rust-openssl issue?
I'm trying to build a Rust program, which has crates with native dependencies, inside an aarch64 (qemu) container on an amd64 arch host. My docker file includes libssl-dev.
My docker file is:
I run
sudo docker build --platform=linux/arm/v8 -t arm64debianbullseye .
(successful) andsudo docker run --platform=linux/arm/v8 -v /my/local/path:/my/container/path -it arm64debianbullseye
Inside the container, I run
cargo build
(as root).The error is:
Things I've tried:
openssl.pc
:but the error is similar:
Caused by: process didn't exit successfully:
/home/docker/my.container/path/target/debug/build/openssl-sys-e86280ee2fd7989a/build-script-main
(exit status: 101) --- stdout cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset cargo:rerun-if-env-changed=OPENSSL_LIB_DIR OPENSSL_LIB_DIR unset cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR OPENSSL_INCLUDE_DIR unset cargo:rerun-if-env-changed=AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset cargo:rerun-if-env-changed=OPENSSL_DIR OPENSSL_DIR = /usr/lib/ssl--- stderr thread 'main' panicked at /home/docker/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.102/build/main.rs:96:9: OpenSSL include directory does not exist: /usr/lib/ssl/include note: run with
RUST_BACKTRACE=1
environment variable to display a backtrace warning: build failed, waiting for other jobs to finish...