mirror of
https://github.com/dockersrc/rust
synced 2026-08-09 02:01:13 -04:00
- rootfs/usr/local/bin/entrypoint.sh:
1. The "start all services" gate
(`if [ "$START_SERVICES" = "yes" ] || [ -z "$1" ]`) always evaluated
true on a first-run container regardless of $1, because
START_SERVICES is force-set to "yes" whenever no PID file exists yet.
Any command passed to `docker run` — `exec ...`, `sh -c ...`,
`shell`, or an arbitrary program — was swallowed into the
service-start+monitor branch before reaching the `case "$1"`
statement that already handles those subcommands, hanging the
container as a daemon instead of running the given command. Changed
the condition to `if [ -z "$1" ]` so the daemon branch only fires
when no command was given at all.
2. The `*/bin/sh | */bin/bash | bash | sh | shell)` case branch
unconditionally shifted $1 before `__exec_command "$@"` (a bare
`exec "$@"`). For `docker run image sh -c 'cmd'` this turned the
exec into `exec -c cmd` (command not found, exit 127) instead of
`exec sh -c 'cmd'`. Split the branch: real interpreter names
(*/bin/sh, */bin/bash, bash, sh) now pass through unshifted; the
"shell" keyword (not a real interpreter) gets its own branch that
shifts and prepends "sh" to any remaining args, or falls back to a
bare `__exec_command` (exec bash -l) when none remain.
Verified `bash -n` passes. Found and fixed upstream in
dockersrc/go, confirmed identical in this repo's generated
entrypoint.sh, and mechanically applied here with the same patch.
This commit is contained in:
Executable
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -x
|
||||||
|
echo "== rustc =="; rustc --version
|
||||||
|
echo "== cargo =="; cargo --version
|
||||||
|
echo "== rustfmt =="; rustfmt --version
|
||||||
|
echo "== clippy =="; cargo clippy --version
|
||||||
|
echo "== just =="; just --version
|
||||||
|
echo "== sccache =="; sccache --version
|
||||||
|
echo "== cargo-nextest =="; cargo nextest --version
|
||||||
|
echo "== cargo-audit =="; cargo audit --version
|
||||||
|
echo "== cargo-binstall =="; cargo binstall --version
|
||||||
|
echo "== targets installed =="; rustup target list --installed
|
||||||
|
echo "== nightly + miri =="; rustup run nightly rustc --version; cargo +nightly miri --version
|
||||||
|
echo "== cross compile aarch64-musl hello world =="
|
||||||
|
mkdir -p /tmp/hello && cd /tmp/hello
|
||||||
|
cat > Cargo.toml <<'EOF'
|
||||||
|
[package]
|
||||||
|
name = "hello"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
EOF
|
||||||
|
mkdir -p src
|
||||||
|
echo 'fn main() { println!("hello cross"); }' > src/main.rs
|
||||||
|
cargo build --release --target aarch64-unknown-linux-musl
|
||||||
|
file target/aarch64-unknown-linux-musl/release/hello
|
||||||
|
echo "== rust-workflow help =="
|
||||||
|
rust-workflow --help 2>&1 | head -20 || echo "rust-workflow not found or errored"
|
||||||
|
echo "== ALL DONE =="
|
||||||
+12
-7
@@ -82,15 +82,19 @@ ENV CARGO_INSTALL_ROOT=/rust-tools
|
|||||||
# Install all Rust tools for the target arch — prebuilt binaries ONLY, no source fallback.
|
# Install all Rust tools for the target arch — prebuilt binaries ONLY, no source fallback.
|
||||||
# Tools without prebuilts for the target arch are silently skipped (exit 0).
|
# Tools without prebuilts for the target arch are silently skipped (exit 0).
|
||||||
# This cuts arm64 build time from hours to minutes.
|
# This cuts arm64 build time from hours to minutes.
|
||||||
|
# One `cargo binstall` invocation PER tool — cargo-binstall resolves its whole
|
||||||
|
# argument list before installing anything, so batching tools in one invocation
|
||||||
|
# means a single tool with no prebuilt (--disable-strategies compile forbids the
|
||||||
|
# cargo-install fallback) aborts the entire batch and silently installs nothing,
|
||||||
|
# even for tools that resolved fine. Isolating each tool's `|| true` is required
|
||||||
|
# for "skip what's missing, keep what's available" to actually work.
|
||||||
RUN --mount=type=cache,id=cargo-registry-native,sharing=shared,target=/usr/local/cargo/registry \
|
RUN --mount=type=cache,id=cargo-registry-native,sharing=shared,target=/usr/local/cargo/registry \
|
||||||
--mount=type=cache,id=cargo-git-native,sharing=locked,target=/usr/local/cargo/git \
|
--mount=type=cache,id=cargo-git-native,sharing=locked,target=/usr/local/cargo/git \
|
||||||
set -o pipefail; \
|
set -o pipefail; \
|
||||||
RUST_TARGET="$(cat /tmp/rust-target)"; \
|
RUST_TARGET="$(cat /tmp/rust-target)"; \
|
||||||
# Disable telemetry prompt — required for non-interactive builds
|
# Disable telemetry prompt — required for non-interactive builds
|
||||||
mkdir -p /usr/local/cargo && echo 'disable-telemetry = true' > /usr/local/cargo/binstall.toml; \
|
mkdir -p /usr/local/cargo && echo 'disable-telemetry = true' > /usr/local/cargo/binstall.toml; \
|
||||||
BINSTALL="cargo binstall -y --disable-strategies compile --target ${RUST_TARGET}"; \
|
for tool in \
|
||||||
# Core tools — most have prebuilts for both amd64 and arm64
|
|
||||||
$BINSTALL \
|
|
||||||
cargo-binstall \
|
cargo-binstall \
|
||||||
cargo-edit \
|
cargo-edit \
|
||||||
cargo-watch \
|
cargo-watch \
|
||||||
@@ -120,9 +124,7 @@ RUN --mount=type=cache,id=cargo-registry-native,sharing=shared,target=/usr/local
|
|||||||
cargo-sort \
|
cargo-sort \
|
||||||
cargo-hack \
|
cargo-hack \
|
||||||
dprint \
|
dprint \
|
||||||
grcov || true; \
|
grcov \
|
||||||
# Secondary tools — may or may not have prebuilts
|
|
||||||
$BINSTALL \
|
|
||||||
cargo-llvm-cov \
|
cargo-llvm-cov \
|
||||||
cargo-tarpaulin \
|
cargo-tarpaulin \
|
||||||
wasm-pack \
|
wasm-pack \
|
||||||
@@ -151,7 +153,10 @@ RUN --mount=type=cache,id=cargo-registry-native,sharing=shared,target=/usr/local
|
|||||||
flamegraph \
|
flamegraph \
|
||||||
probe-rs \
|
probe-rs \
|
||||||
sqlx-cli \
|
sqlx-cli \
|
||||||
sea-orm-cli || true
|
sea-orm-cli; \
|
||||||
|
do \
|
||||||
|
cargo binstall -y --disable-strategies compile --target "${RUST_TARGET}" "${tool}" || true; \
|
||||||
|
done
|
||||||
|
|
||||||
FROM ${PULL_URL}:${DISTRO_VERSION} AS build
|
FROM ${PULL_URL}:${DISTRO_VERSION} AS build
|
||||||
ARG TZ
|
ARG TZ
|
||||||
|
|||||||
@@ -480,7 +480,11 @@ SKIP_SERVICE_START="no"
|
|||||||
[ "$2" = "init" ] && SKIP_SERVICE_START="yes" && CONTAINER_INIT="yes"
|
[ "$2" = "init" ] && SKIP_SERVICE_START="yes" && CONTAINER_INIT="yes"
|
||||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
# Start all services if no pidfile and not skipping
|
# Start all services if no pidfile and not skipping
|
||||||
if [ "$START_SERVICES" = "yes" ] || [ -z "$1" ]; then
|
# Start all services only when no command was given at all — an explicit
|
||||||
|
# command (exec, shell, tail, or an arbitrary program) must reach the case
|
||||||
|
# statement below instead of being swallowed into daemon/monitor mode, even
|
||||||
|
# on a first run where START_SERVICES is force-set to "yes"
|
||||||
|
if [ -z "$1" ]; then
|
||||||
if [ "$SKIP_SERVICE_START" = "no" ]; then
|
if [ "$SKIP_SERVICE_START" = "no" ]; then
|
||||||
[ "$1" = "start" ] && shift 1
|
[ "$1" = "start" ] && shift 1
|
||||||
[ "$1" = "all" ] && shift 1
|
[ "$1" = "all" ] && shift 1
|
||||||
@@ -622,11 +626,25 @@ procs)
|
|||||||
exit $?
|
exit $?
|
||||||
;;
|
;;
|
||||||
# Launch shell
|
# Launch shell
|
||||||
*/bin/sh | */bin/bash | bash | sh | shell)
|
# Launch shell — do not shift here: "sh -c 'cmd'" / "bash -c 'cmd'" needs the
|
||||||
shift 1
|
# interpreter name kept as argv[0] for __exec_command's `exec "$@"` to work;
|
||||||
|
# shifting it away turned "sh -c 'cmd'" into `exec -c cmd` (command not found)
|
||||||
|
*/bin/sh | */bin/bash | bash | sh)
|
||||||
__exec_command "$@"
|
__exec_command "$@"
|
||||||
exit $?
|
exit $?
|
||||||
;;
|
;;
|
||||||
|
# "shell" is a keyword, not a real interpreter — it must be shifted away, and
|
||||||
|
# any remaining args need "sh" prepended so __exec_command's `exec "$@"` gets
|
||||||
|
# a real interpreter instead of trying to exec "-c" as a program
|
||||||
|
shell)
|
||||||
|
shift 1
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
__exec_command
|
||||||
|
else
|
||||||
|
__exec_command sh "$@"
|
||||||
|
fi
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
# execute commands
|
# execute commands
|
||||||
exec)
|
exec)
|
||||||
shift 1
|
shift 1
|
||||||
|
|||||||
Reference in New Issue
Block a user