J'essaie de déplacer mon Rust serveur de Heroku à Google Cloud ou AWS. Même si j'aime la simplicité d'avoir un git Push
Construisez et déployez-vous sur Heroku avec simplement un buildpack spécifié, le service n'est pas rentable pour moi.
J'ai identifié Google Cloud Run et AWS Elastic BeanStalk comme alternatives potentielles.
Tout d'abord, j'ai besoin de construire une image Docker avec un binaire statique.
Ainsi, j'ai ajouté ce dockerfile:
FROM Rust AS build
WORKDIR /usr/src
RUN rustup target add x86_64-unknown-linux-musl
RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
RUN USER=root cargo new loxe-api
WORKDIR /usr/src/loxe-api
COPY Cargo.toml Cargo.lock ./
COPY data ./data
COPY migrations ./migrations
ENV RUSTFLAGS="-C target-feature=+crt-static" # this should be set by the target, but just to be sure
RUN cargo build --release
COPY src ./src
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
RUN cargo install --target x86_64-unknown-linux-musl --path .
FROM scratch
COPY --from=build /usr/local/cargo/bin/loxe-api .
COPY data ./data
COPY migrations ./migrations
USER 1000
CMD ["./loxe-api"]
L'image obtient sa construction sans erreurs, mais si je l'exécute via Docker Run, je reçois cette erreur:
standard_init_linux.go: 219: EXEC PROCESSUS DE L'UTILISATEUR FAIT: Aucun fichier ou répertoire de ce type
En remplaçant l'image de base de la dernière étape avec la rouille, j'ai vérifié si les fichiers binaires et autres sont en fait dans l'image. Ils sont, je peux les voir via LS, mais je ne peux pas non plus exécuter loxe-api
En entrant dans la coquille.
dockerd enregistre ceci:
INFO[2020-07-05T13:04:42.368119033-07:00] shim containerd-shim started address=/containerd-shim/bf85e63468a9c1b3b9fe418b5a186673f0609bfff20c4832789ae87433e82473.sock debug=false pid=27032
INFO[2020-07-05T13:04:42.913438974-07:00] shim reaped id=8cadeee800649ceca8a52d9a75cc9071b923d01a5d2a37497bf8b9a6e719267a
INFO[2020-07-05T13:04:42.925442900-07:00] ignoring event module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
Voici les dépendances-Section de la cargaison.toml:
[dependencies]
actix = "0.9"
actix-cors = "0.2"
actix-identity = "0.2"
actix-multipart = "0.2"
actix-rt = "1.0"
actix-web = "2.0"
argonautica = "0.2"
brotli = "3.3"
bytes = { version = "0.5", features = ["serde"] }
chrono = { version = "0.4", features = ["serde"] }
derive_more = "0.99"
diesel = { version = "1.4", features = ["postgres", "uuidv07", "r2d2", "chrono", "serde_json"] }
diesel_migrations = "1.4"
dotenv = "0.15"
env_logger = "0.7"
futures = "0.3"
indexmap = { version = "1.3", features = ["serde-1"] }
lazy_static = "1.4"
log = "0.4"
openssl = { version = "0.10", features = ["vendored"] }
openssl-probe = "0.1.2"
percent-encoding = "2.1"
r2d2 = "0.8"
Rand = "0.7"
redis = "0.15"
rusoto_core = { version = "0.44" }
rusoto_s3 = { version = "0.44" }
sanitize-filename = "0.2"
sendgrid = { version = "0.10", features = ["rustls"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
stripe-Rust = "0.12"
uuid = { version = "0.8", features = ["serde", "v4"] }
wana_kana = "2.0"
En savoir plus sur l'intérieur du conteneur:
$ ldd /loxe-api
linux-vdso.so.1 (0x00007ffcc219d000)
libpq.so.5 => /usr/lib/x86_64-linux-gnu/libpq.so.5 (0x00007f2d3792d000)
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f2d3789b000)
libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f2d375b2000)
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f2d37565000)
libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f2d37511000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2d374f0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d3732d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2d37328000)
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f2d37248000)
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f2d37214000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f2d3720e000)
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f2d371ff000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f2d371f6000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f2d371dc000)
liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f2d371cb000)
libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f2d371ae000)
libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f2d37002000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f2d37983000)
libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f2d36ed1000)
libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f2d36eb2000)
libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f2d36d2e000)
libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f2d36b1b000)
libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007f2d36ae3000)
libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007f2d36aaa000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f2d36a25000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f2d36a1b000)
J'ai aussi essayé de construire et d'exécuter de mon système hôte. L'Iran cargo run --target x86_64-unknown-linux-musl --release
qui a construit le binaire, mais a finalement abouti à cette erreur:
erreur: impossible d'exécuter le processus
target/x86_64-unknown-linux-musl/release/loxe-api
(jamais exécuté)
J'ai vérifié l'existence de la binaire via du -h target/x86_64-unknown-linux-musl/release/loxe-api
:
35M target/x86_64-unknown-linux-musl/release/loxe-api
Des tentatives infructueuses infructueuses avec des reportages imprenables, clux/Muslrust et Muslrust et EMK/Rust-Musl-Builder Builder ont été apportés.
Construire et exécuter un nouveau projet de cargaison par défaut avec les travaux de la cible X86_64-Linux-MUSL. Je suppose, libllang, Brotli ou certaines des bibliothèques Argonautica peuvent ne pas fonctionner.
Voici un dockerfile simplifié qui donne le même résultat.
FROM Rust AS build
WORKDIR /usr/src
RUN rustup target add x86_64-unknown-linux-musl
RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
RUN USER=root cargo new loxe-api
WORKDIR /usr/src/loxe-api
COPY Cargo.toml Cargo.lock ./
COPY data ./data
COPY migrations ./migrations
COPY src ./src
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
ENV RUSTFLAGS="-C target-feature=+crt-static"
RUN cargo install --target x86_64-unknown-linux-musl --path .
FROM debian
COPY --from=build /usr/local/cargo/bin/loxe-api .
COPY .env ./.env
COPY data ./data
COPY migrations ./migrations
USER 1000
CMD ["./loxe-api"]
Je ne peux pas construire votre dockerfile simplifié tel que parce que je n'ai pas les fichiers source que vous référez dans les instructions de copie, donc je reçois des erreurs "Échec de la copie". Vous dites "Construire et exécuter un nouveau projet de cargaison par défaut avec les travaux de la cible X86_64-Linux-MUSL" et bien ce dockerfile (votre DockerFile simplifié avec les commandes de copie supprimées) fonctionne bien pour moi:
FROM Rust AS build
WORKDIR /usr/src
RUN rustup target add x86_64-unknown-linux-musl
RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
RUN USER=root cargo new loxe-api
WORKDIR /usr/src/loxe-api
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV OPENSSL_INCLUDE_DIR="/usr/include/openssl"
ENV RUSTFLAGS="-C target-feature=+crt-static"
RUN cargo install --target x86_64-unknown-linux-musl --path .
FROM debian
COPY --from=build /usr/local/cargo/bin/loxe-api .
USER 1000
CMD ["./loxe-api"]
Cependant, lorsque je construis cela, je reçois un exécutable lié statiquement lié, ce que j'attends, mais pas ce que votre sortie ldd
montre. Mon LDD:
$ ldd loxe-api
not a dynamic executable
De même, je peux construire votre plus grand dockerfile après avoir retiré les commandes de la copie et le commentaire, et il se développe bien pour moi.
Êtes-vous peut-être utilisé Windows? Vous risquez peut-être des problèmes de fin de ligne et de mettre à jour votre configuration git
et recouvrir votre repo git pourrait aider.
# update git to automatically set line ending to LF
git config --global core.eol lf
git config --global core.autocrlf input
Après cela, vous devrez supprimer et ré-cloner votre repo git. Voir Ce Doc utile de GitHub Pour plus.
Si cela ne vous aide pas, veuillez publier un code qui reproduit le problème.