Docker image for FastTransfer, a high-performance data transfer tool.
3.2K
Minimal, production-ready container image to run FastTransfer (parallel data import/transfer CLI), a high-performance data transfer utility designed for data integration and automation workflows.
This setup targets FastTransfer ≥ 0.14.0, which supports passing the license inline via --license "<content>".
debian:trixie-slim/usr/local/bin/FastTransferFor custom builds
The FastTransfer binary is not distributed in this repository. Request the Linux x64 build here:
FastTransfer trial Unzip and place it at the repository root (next to theDockerfile), then build your own custom image.
FastTransfer_Settings.json to mount/copy into /config for custom logging settingsFastTransfer and ensure it is executable if testing locally:
chmod +x FastTransfer
Dockerfile).docker build -t fasttransfer:latest .
docker run --rm fasttransfer:latest --version
This container has ENTRYPOINT set to the FastTransfer binary. Any arguments you pass to docker run are forwarded to FastTransfer.
docker run --rm fasttransfer:latest --help
You can use a prebuilt image from DockerHub that already includes the FastTransfer binary. You must provide your own license at runtime.
DockerHub repository: arpeio/fasttransfer
v0.28.8)latest tag always points to the most recent FastTransfer versionv0.28.9 (latest of 0.28.x branch), it gets security updates even after v0.29.0 is released# Latest version
docker pull arpeio/fasttransfer:latest
# Specific version
docker pull arpeio/fasttransfer:v0.28.8
# Get help
docker run --rm arpeio/fasttransfer:latest --help
# Check version
docker run --rm arpeio/fasttransfer:latest --version
The Docker image uses the FastTransfer binary as its entrypoint, so you can run it directly with parameters as defined in the FastTransfer documentation.
# Get command line help
docker run --rm arpeio/fasttransfer:latest --help
# Check version
docker run --rm arpeio/fasttransfer:latest --version
Since version 0.14.0, pass the license content directly via --license "…".
export licenseContent=$(cat ./FastTransfer.lic)
# Use $licenseContent in your docker run commands
docker run --rm arpeio/fasttransfer:latest \
--license "$licenseContent" \
[other parameters...]
Best practice: Prefer --env-file, Docker/Compose/Kubernetes secrets, or managed identities for cloud credentials. Avoid leaving the license content in shell history.
The exact parameters depend on your source and target settings. The snippets below illustrate the call pattern from Docker in a Linux shell.
export licenseContent=$(cat ./FastTransfer.lic)
docker run --rm \
arpeio/fasttransfer:latest \
--sourceconnectiontype "mssql" \
--sourceserver "host.docker.internal,1433" \
--sourceuser "SrcUser" \
--sourcepassword "SrcPass" \
--sourcedatabase "source_db" \
--targetconnectiontype "msbulk" \
--targetserver "host.docker.internal,1433" \
--targetuser "DestUser" \
--targetpassword "DestPass" \
--targetdatabase "dest_db" \
--method "Ntile" \
--distributekeycolumn "id" \
--loadmode "Truncate" \
--paralleldegree 8 \
--license "$licenseContent"
export licenseContent=$(cat ./FastTransfer.lic)
docker run --rm \
-v /local/data:/data \
arpeio/fasttransfer:latest \
--sourceconnectiontype "file" \
--fileinput "/data/files/*.csv" \
--targetconnectiontype "pgcopy" \
--targetserver "host.docker.internal:5432" \
--targetuser "PgUser" \
--targetpassword "PgPass" \
--targetdatabase "pg_db" \
--targetschema "public" \
--targettable "imported_table" \
--loadmode "Truncate" \
--paralleldegree -2 \
--license "$licenseContent"
export licenseContent=$(cat ./FastTransfer.lic)
docker run --rm \
-e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
-e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
-e AWS_REGION=${AWS_REGION} \
arpeio/fasttransfer:latest \
--sourceconnectiontype "mssql" \
--sourceserver "host.docker.internal,1433" \
--sourceuser "SrcUser" \
--sourcepassword "SrcPass" \
--sourcedatabase "source_db" \
--query "SELECT * FROM dbo.orders WHERE year(o_orderdate)=2024" \
--fileoutput "orders.parquet" \
--directory "s3://my-bucket/data/" \
--paralleldegree 12 \
--parallelmethod "Ntile" \
--distributekeycolumn "o_orderkey" \
--merge false \
--license "$licenseContent"
export licenseContent=$(cat ./FastTransfer.lic)
export adlscontainer="my-adls-container"
docker run --rm \
-e AZURE_CLIENT_ID=${AZURE_CLIENT_ID} \
-e AZURE_TENANT_ID=${AZURE_TENANT_ID} \
-e AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} \
arpeio/fasttransfer:latest \
--sourceconnectiontype "pgcopy" \
--sourceserver "host.docker.internal:5432" \
--sourceuser "PgUser" \
--sourcepassword "PgPass" \
--sourcedatabase "pg_db" \
--sourceschema "public" \
--sourcetable "orders" \
--query "SELECT * FROM public.orders WHERE order_date >= '2024-01-01'" \
--fileoutput "orders.parquet" \
--directory "abfss://${adlscontainer}.dfs.core.windows.net/data/orders" \
--paralleldegree -2 \
--parallelmethod "Ctid" \
--license "$licenseContent"
export licenseContent=$(cat ./FastTransfer.lic)
export gcsbucket="my-gcs-bucket"
export GOOGLE_APPLICATION_CREDENTIALS_JSON=$(cat ./gcp-credentials.json)
docker run --rm \
-e GOOGLE_APPLICATION_CREDENTIALS="${GOOGLE_APPLICATION_CREDENTIALS_JSON}" \
arpeio/fasttransfer:latest \
--sourceconnectiontype "oraodp" \
--sourceserver "host.docker.internal:1521/FREEPDB1" \
--sourceuser "SCHEMA_USER" \
--sourcepassword "SCHEMA_PASS" \
--database "FREEPDB1" \
--sourceschema "SCHEMA_USER" \
--sourcetable "ORDERS" \
--fileoutput "orders.parquet" \
--directory "gs://${gcsbucket}/data/orders" \
--parallelmethod "Rowid" \
--paralleldegree -2 \
--license "$licenseContent"
The Docker image declares several volumes to organize data and configuration:
VOLUME ["/config", "/data", "/work", "/logs"]
| Volume Path | Description | Access Mode | Typical Usage |
|---|---|---|---|
/config | Contains user-provided configuration files (e.g., Serilog settings) | Read-only / Read-many | Shared across multiple containers; not modified |
/data | Input/output data directory for file-based operations | Read-many/Write-many | Stores imported or exported data files |
/work | Temporary working directory (container WORKDIR) | Read-many/Write-many | Used internally for temporary processing |
/logs | Log output directory (per-run or aggregated logs) | Read-many/Write-many | Stores runtime and execution logs |
Available starting from version 0.14.0
FastTransfer supports custom logging configuration through an external Serilog settings file in JSON format. This allows you to control how and where logs are written — to the console, to files, or dynamically per run.
Custom settings files must be mounted into the container under the /config directory.
The following configuration is recommended for most production or Airflow environments. It writes:
/airflow/xcom/return.json for Airflow integration/logs, automatically named with {LogTimestamp} and {TraceId}{
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.File",
"Serilog.Enrichers.Environment",
"Serilog.Enrichers.Thread",
"Serilog.Enrichers.Process",
"Serilog.Enrichers.Context",
"Serilog.Formatting.Compact"
],
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-ddTHH:mm:ss.fff zzz} -|- {Application} -|- {runid} -|- {Level:u12} -|- {fulltargetname} -|- {Message}{NewLine}{Exception}",
"theme": "Serilog.Sinks.SystemConsole.Themes.ConsoleTheme::None, Serilog.Sinks.Console",
"applyThemeToRedirectedOutput": false
}
},
{
"Name": "File",
"Args": {
"path": "/airflow/xcom/return.json",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
},
{
"Name": "Map",
"Args": {
"to": [
{
"Name": "File",
"Args": {
"path": "/logs/{logdate}/{sourcedatabase}/log-{filename}-{LogTimestamp}-{TraceId}.json",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact",
"rollingInterval": "Infinite",
"shared": false,
"encoding": "utf-8"
}
}
]
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithProcessId",
"WithThreadId"
],
"Properties": {
"Application": "FastTransfer"
}
}
}
Important notes:
/logs or /airflow/xcom) does not exist, FastTransfer automatically creates it./airflow/xcom/return.json is designed to provide run summaries compatible with Airflow's XCom mechanism.You can use the following placeholders to dynamically generate log file names or directories:
| Token Name | Description |
|---|---|
{logdate} | Current date in yyyy-MM-dd format |
{logtimestamp} | Full timestamp of the log entry |
{sourcedatabase} | Name of the source database |
{sourceschema} | Name of the source schema |
{sourcetable} | Name of the source table |
{filename} | Name of the file being processed |
{runid} | Run identifier provided in the command line |
{traceid} | Unique trace identifier generated at runtime |
Your Serilog configuration file (for example, FastTransfer_Settings.json) must be placed in /config,
either by mounting a local directory or by using a Docker named volume.
Example with named volumes:
# First, copy your config file to a volume location
cp ~/FastTransfer_Settings.json /volumes/fasttransfer-config/
# Then run FastTransfer with mounted volumes
docker run --rm \
-v fasttransfer-config:/config \
-v fasttransfer-data:/data \
-v fasttransfer-logs:/logs \
arpeio/fasttransfer:latest \
--settingsfile "/config/FastTransfer_Settings.json" \
--sourceconnectiontype "mssql" \
--sourceserver "host.docker.internal,1433" \
--sourceuser "SrcUser" \
--sourcepassword "SrcPass" \
--sourcedatabase "source_db" \
--targetconnectiontype "pgcopy" \
--targetserver "host.docker.internal:5432" \
--targetuser "PgUser" \
--targetpassword "PgPass" \
--targetdatabase "pg_db" \
--query "SELECT * FROM dbo.orders" \
--fileoutput "orders.parquet" \
--directory "/data" \
--paralleldegree 12 \
--parallelmethod "Ntile" \
--distributekeycolumn "o_orderkey" \
--merge false \
--license "$licenseContent"
If the --settingsfile argument is not provided, FastTransfer will use its built-in default logging configuration.
/data on fast storage (NVMe) when exporting/importing large datasets locally.--paralleldegree according to CPU cores and I/O throughput of source/target systems.--add-host=host.docker.internal:host-gateway (or the extra_hosts entry in Compose).--env-file) and managed identities (IAM Role / IRSA / Workload Identity / Managed Identity).chmod +x FastTransfer).libicu/libssl/zlib/krb5 → the image includes libicu76, libssl3, zlib1g, libkrb5-3. If your build requires additional libs, add them via apt./data or /logs → ensure the host directory permissions match the container UID (10001).--add-host=host.docker.internal:host-gateway or the Compose extra_hosts equivalent.--license, or that your trial license is valid and the binary version matches.Content type
Image
Digest
sha256:11698833f…
Size
225.1 MB
Last updated
2 months ago
docker pull arpeio/fasttransfer