mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-27 03:13:56 +08:00
156 lines
5.6 KiB
Markdown
156 lines
5.6 KiB
Markdown
# Building Docker Images
|
|
|
|
## Cargo Features
|
|
|
|
The Hyperswitch application server makes extensive use of
|
|
[Cargo features][cargo-features] to selectively toggle certain features and
|
|
integrations.
|
|
The list of features can be found in the `[features]` section in the
|
|
[`crates/router/Cargo.toml`][router-manifest] file.
|
|
|
|
Of these features, the noteworthy ones are the `default` and `release` features:
|
|
|
|
- `default`: This feature set enables a basic set of necessary features for both
|
|
development and production environments, such as the transactional APIs,
|
|
APIs used by the control center, Stripe compatibility, automatic payment
|
|
retries, in-memory caching, etc.
|
|
|
|
- `release`: This feature set enables some additional features that are suitable
|
|
for production environments, such as AWS KMS integration, AWS S3 integration,
|
|
AWS SES integration, etc.
|
|
|
|
Refer to the [documentation on cargo features][cargo-features] to understand how
|
|
to select features with Cargo, when building the application server.
|
|
|
|
## Building with the Dockerfile
|
|
|
|
The Docker images for the application server and other components can be built
|
|
using the [`Dockerfile`][dockerfile] using the below commands, substituting the
|
|
Docker image tags with suitable values:
|
|
|
|
- router:
|
|
|
|
```shell
|
|
docker build \
|
|
--load \
|
|
--file Dockerfile \
|
|
--build-arg "BINARY=router" \
|
|
--tag hyperswitch-router \
|
|
.
|
|
```
|
|
|
|
- consumer:
|
|
|
|
```shell
|
|
docker build \
|
|
--load \
|
|
--file Dockerfile \
|
|
--build-arg "BINARY=scheduler" \
|
|
--build-arg "SCHEDULER_FLOW=consumer" \
|
|
--tag hyperswitch-consumer \
|
|
.
|
|
```
|
|
|
|
- producer:
|
|
|
|
```shell
|
|
docker build \
|
|
--load \
|
|
--file Dockerfile \
|
|
--build-arg "BINARY=scheduler" \
|
|
--build-arg "SCHEDULER_FLOW=producer" \
|
|
--tag hyperswitch-producer \
|
|
.
|
|
```
|
|
|
|
- drainer:
|
|
|
|
```shell
|
|
docker build \
|
|
--load \
|
|
--file Dockerfile \
|
|
--build-arg "BINARY=drainer" \
|
|
--tag hyperswitch-drainer \
|
|
.
|
|
```
|
|
|
|
When our Docker images are built using the [`Dockerfile`][dockerfile], the
|
|
`cargo` command being run is:
|
|
|
|
```shell
|
|
cargo build --release --features release ${EXTRA_FEATURES}
|
|
```
|
|
|
|
- The `--release` flag specifies that optimized release binaries must be built.
|
|
Refer to the [`cargo build` manual page][cargo-build-manual-page] for more
|
|
information.
|
|
|
|
- The `--features release` flag specifies that the `release` feature set must be
|
|
enabled for the build.
|
|
Since we do not specify the `--no-default-features` flag to the `cargo build`
|
|
command, the build would have the `default` and `release` features enabled.
|
|
|
|
- In case you create your own features sets and want to enable them, you can use
|
|
the `${EXTRA_FEATURES}` build argument to specify any additional features that
|
|
would have to be passed to the `cargo build` command.
|
|
The build argument could look as follows:
|
|
`EXTRA_FEATURES="--features feature1,feature2,feature3"`, with actual feature
|
|
names substituted in the command.
|
|
|
|
## Image Variants on Docker Hub
|
|
|
|
As of writing this document, we have two image variants available on our Docker
|
|
Hub repositories:
|
|
|
|
- release: These images contain only the tag that was built, and no other
|
|
suffixes, like the `v1.105.1` and `v1.107.0` Docker images.
|
|
|
|
- standalone: These images contain the tag that was built with a `standalone`
|
|
suffix, like the `v1.105.1-standalone` and `v1.107.0-standalone` Docker images.
|
|
|
|
The primary difference is that our standalone Docker images do not have some
|
|
features enabled by default in order to support hosting of Hyperswitch outside
|
|
AWS.
|
|
As of writing this document, the standalone images exclude the `email` and
|
|
`recon` features from the `release` feature set, while the release images are
|
|
built from the Dockerfile without any changes to the codebase after the tag is
|
|
checked out.
|
|
|
|
If you are building custom images and would like to mirror the behavior of our
|
|
standalone images, then you'd have to remove the `email` and `recon` features
|
|
from the `release` feature set.
|
|
|
|
## Frequently Asked Questions
|
|
|
|
### What machine specifications would I need to build release images?
|
|
|
|
Building release (optimized) images needs significant amount of resources, and
|
|
we'd recommend using a machine with at least 8 cores and 16 GB of RAM for this
|
|
purpose.
|
|
Rust is known to have long compile times, and a codebase of this size will
|
|
require a significant time to build, around 45-60 minutes for the above
|
|
configuration.
|
|
|
|
### Build seems to be stuck at "Compiling router/scheduler/analytics/..."
|
|
|
|
The compilation process involves compiling all of our dependencies and then
|
|
compiling our workspace (first-party) crates, among which the biggest one
|
|
(in terms of lines of code) is the `router` crate.
|
|
Once all the dependencies of the `router` crate have been built, one of the last
|
|
ones being built is the `router` crate itself.
|
|
|
|
As mentioned above, building release images takes a significant amount of time.
|
|
It is normal to see nothing else being printed after a line which says
|
|
`Compiling router / scheduler / analytics / ...`. We'd suggest waiting
|
|
for a while.
|
|
If you're still concerned that the compilation process has been stuck for far
|
|
too long, you can check if at least one CPU is being utilized by
|
|
`cargo` / `docker` using a tool like `htop` (if you can access the machine which
|
|
is building the code). Worst case, you can proceed to kill the compilation
|
|
process and try again.
|
|
|
|
[cargo-features]: https://doc.rust-lang.org/cargo/reference/features.html
|
|
[router-manifest]: https://github.com/juspay/hyperswitch/blob/main/crates/router/Cargo.toml
|
|
[dockerfile]: https://github.com/juspay/hyperswitch/blob/main/Dockerfile
|
|
[cargo-build-manual-page]: https://doc.rust-lang.org/cargo/commands/cargo-build.html
|