DockerでHerokuでRustが動いたぞ!!!
Dockerを使ってHerokuにRustのアプリケーションをデプロイしてみた。
リポジトリ: hrysd/rust-on-heroku-with-docker
デプロイするまで
heroku docker:init
で生成される Dockerfile
を元に、いろいろと参考にして書いてみた。
アプリケーションのコード自体は hyperium/hyper の example をちょっといじったもの。
困ったこと
当初 OSX でビルドしたバイナリを Docker に入れて動かそうとしたんだけど、当然の如く実行できない。 そのため、コンテナ内に Rust をインストールしてコンテナ内でアプリケーションのバイナリをビルドするようにした。
ただ、cargo build
には --target
オプションがあるようで、もしかしたらこれでクロスコンパイルできる...?
Compile a local package and all of its dependencies
Usage:
cargo build [options]
Options:
-h, --help Print this message
-p SPEC, --package SPEC Package to build
-j N, --jobs N The number of jobs to run in parallel
--lib Build only lib (if present in package)
--release Build artifacts in release mode, with optimizations
--features FEATURES Space-separated list of features to also build
--no-default-features Do not build the `default` feature
--target TRIPLE Build for the target triple <= これ!!
--manifest-path PATH Path to the manifest to compile
-v, --verbose Use verbose output
結果
最終的に Dockerfile
は以下のような感じになった。
FROM heroku/cedar:14
RUN useradd -d /app -m app
WORKDIR /app
ENV PORT 3000
ENV SHELL /bin/sh
RUN curl -s https://static.rust-lang.org/rustup.sh | sh -s -- --disable-sudo --channel=nightly -y
USER app
RUN mkdir -p /app/src
RUN mkdir -p /app/.profile.d
ONBUILD COPY . /app/src/
USER root
WORKDIR /app/src
ONBUILD RUN cargo build -v --release
ONBUILD EXPOSE 3000
最後に
DockerもRustも詳しくないのでてんやわんやしたけど、軽く入門できてよかった。 Rust を動かす環境でお悩みの際は試していただけると!!