An Integration Agent is a zero-maintenance ETL engine which runs behind the company’s firewall.
2.3K
The Integration Agent runs Etlworks data pipelines inside your own network, behind your firewall. This image includes the Agent, Java runtime, and bundled JDBC drivers.
Install and manage it with standard Docker commands. No native installer, host Java installation, or host Agent CLI is required.
You need an Etlworks account and an Integration Agent license. Start a free trial.
Etlworks is an any-to-any data integration platform for ETL, ELT, change data capture (CDC), EDI, APIs, files, queues, and IoT. Connect your systems, transform data, and orchestrate pipelines from a single workspace.
Build pipelines on a drag-and-drop canvas, write transformations in SQL, JavaScript, or Python, and automate operations through the CLI and APIs. Simba, the built-in AI agent, helps you build flows, diagnose errors, and work with your data using natural language.
Capabilities include log-based CDC, real-time streaming, schema drift handling, data validation, dbt integration, and pipelines as code. Schedule pipelines and monitor execution, performance, and audit history in the same application.
Etlworks runs in the cloud, on-premises, or in a hybrid deployment with Integration Agents executing flows inside your network.
The Integration Agent executes Etlworks flows on infrastructure you control. It lets flows reach databases, files, and applications that the Etlworks host cannot access directly.
Flow processing occurs on the Agent. Where data is read, written, or staged depends on your flow configuration. The Agent exchanges configuration, execution status, and logs with Etlworks.
The Integration Agent executes flows. Simba, the built-in AI agent, helps you build and manage them.
No inbound port is required for communication between the Agent and Etlworks. Flows still need connectivity to their configured sources and destinations.
| Tag | Purpose |
|---|---|
<version>-java25 | A version-qualified Java 25 image |
latest | Moving tag for the release published as latest |
The image build targets linux/amd64 and linux/arm64. Windows and macOS hosts run the Linux image through Docker Desktop or another compatible Docker environment.
Use a published tag matching your deployment and verify its platform availability. For reproducible deployments, pin the image by digest:
etlworks/integration-agent@sha256:<published-digest>
The Java 25 image includes Azul Zulu OpenJDK. You do not install Java on the host.
.alic license file. License instructions.A starting allocation is 2 CPU cores and 4 GB RAM. Adjust resources for your workloads, especially CDC, large datasets, and parallel flows. On Docker Desktop, also check its resource allocation.
Linux / macOS — Bash or Zsh
Choose a writable host location. The following example uses /opt/etlworks/agent:
mkdir -p /opt/etlworks/agent/{config,license,data,logs,plugin,jdbc,jdbc-custom,backups}
cd /opt/etlworks/agent
Creating directories under /opt may require administrator privileges. On Docker Desktop, ensure the chosen location is available for file sharing.
Windows — Command Prompt
mkdir C:\etlworks\agent
cd /d C:\etlworks\agent
for %D in (config license data logs plugin jdbc jdbc-custom backups) do mkdir "%D"
Inside a .bat file, use %%D instead of %D.
Copy the downloaded .alic file into the host's license directory.
Do not rename the license file. Use the license downloaded for this Agent.
For normal UI-managed operation, the license supplies the Agent identity and Etlworks server address. You do not need to extract a configuration template or manually fill in agent-id, client, or etlworks.url.
Replace REPLACE_WITH_PUBLISHED_TAG with the tag you want to deploy.
Linux / macOS — Bash or Zsh
IMAGE="etlworks/integration-agent:REPLACE_WITH_PUBLISHED_TAG"
docker pull "$IMAGE"
docker run -d --name integration-agent \
--init \
--restart unless-stopped \
--stop-timeout 360 \
--memory 4g \
-v /opt/etlworks/agent/config:/opt/etlworks-agent/config \
-v /opt/etlworks/agent/license:/opt/etlworks-agent/license \
-v /opt/etlworks/agent/data:/opt/etlworks-agent/data \
-v /opt/etlworks/agent/logs:/opt/etlworks-agent/logs \
-v /opt/etlworks/agent/plugin:/opt/etlworks-agent/plugin \
-v /opt/etlworks/agent/jdbc:/opt/etlworks-agent/jdbc \
-v /opt/etlworks/agent/jdbc-custom:/opt/etlworks-agent/jdbc-custom \
-v /opt/etlworks/agent/backups:/opt/etlworks-agent/backups \
"$IMAGE"
Windows — Command Prompt
set "IMAGE=etlworks/integration-agent:REPLACE_WITH_PUBLISHED_TAG"
docker pull "%IMAGE%"
docker run -d --name integration-agent ^
--init ^
--restart unless-stopped ^
--stop-timeout 360 ^
--memory 4g ^
-v C:\etlworks\agent\config:/opt/etlworks-agent/config ^
-v C:\etlworks\agent\license:/opt/etlworks-agent/license ^
-v C:\etlworks\agent\data:/opt/etlworks-agent/data ^
-v C:\etlworks\agent\logs:/opt/etlworks-agent/logs ^
-v C:\etlworks\agent\plugin:/opt/etlworks-agent/plugin ^
-v C:\etlworks\agent\jdbc:/opt/etlworks-agent/jdbc ^
-v C:\etlworks\agent\jdbc-custom:/opt/etlworks-agent/jdbc-custom ^
-v C:\etlworks\agent\backups:/opt/etlworks-agent/backups ^
"%IMAGE%"
Replace the host paths if you created the Agent home elsewhere. Container paths remain /opt/etlworks-agent/.... Quote each complete volume argument if its host path contains spaces.
At startup, the image:
etlworks user.These commands work in Bash, Zsh, PowerShell, and Windows Command Prompt:
docker logs --tail 100 integration-agent
docker inspect --format "{{.State.Status}}" integration-agent
docker inspect --format "{{.State.Health.Status}}" integration-agent
Confirm that the Agent appears online in Etlworks, then test a flow.
Docker health checks confirm that the Agent JVM is running. They do not establish successful licensing, connectivity to Etlworks, or successful flow execution.
Compose is optional. Save this as compose.yaml in the host's Agent home and replace the image tag:
services:
integration-agent:
image: etlworks/integration-agent:REPLACE_WITH_PUBLISHED_TAG
container_name: integration-agent
init: true
restart: unless-stopped
stop_grace_period: 6m
mem_limit: 4g
volumes:
- ./config:/opt/etlworks-agent/config
- ./license:/opt/etlworks-agent/license
- ./data:/opt/etlworks-agent/data
- ./logs:/opt/etlworks-agent/logs
- ./plugin:/opt/etlworks-agent/plugin
- ./jdbc:/opt/etlworks-agent/jdbc
- ./jdbc-custom:/opt/etlworks-agent/jdbc-custom
- ./backups:/opt/etlworks-agent/backups
Start and inspect the deployment:
docker compose pull
docker compose up -d
docker compose logs --tail 100
Choose either the docker run deployment or Compose; do not create both with the same container name.
Agent home inside the container is /opt/etlworks-agent.
| Directory | Purpose |
|---|---|
config | Local configuration. Missing defaults are created automatically; existing files are preserved. |
license | Downloaded Agent license. |
data | Working data and persisted execution state, including CDC state where applicable. |
logs | Agent and flow logs. |
plugin | Additional and premium connector drivers. |
jdbc | Active JDBC driver tree. Bundled driver folders are refreshed at startup. |
jdbc-custom | Customer-managed JDBC overlay applied to the active driver tree. |
backups | Storage available for backups created by your maintenance procedures or applicable tooling. |
The examples persist all these directories. Mounting backups does not automatically create backups during a standard Docker update.
The entrypoint initially runs with root privileges to prepare directories and ownership, then drops privileges to the Agent user, UID 10001 by default. Host storage must allow those operations. Read-only mounts or storage that forbids ownership changes may prevent startup.
Docker's memory limit controls the container's total memory allocation:
--memory 4g
In Compose:
mem_limit: 4g
Without an explicit heap override, the Agent uses:
-XX:MaxRAMPercentage=70.0
JAVA_OPTS remains supported. It applies to the Agent JVM, not the setup and health-check JVMs.
For example, add this to docker run:
-e JAVA_OPTS="-Xms100m -Xmx2800m"
Or to the Compose service:
environment:
JAVA_OPTS: "-Xms100m -Xmx2800m"
Leave room within the container limit for native memory, threads, and other JVM overhead. Do not set the heap equal to the entire container memory limit.
Required Java 25 module-access options are applied automatically. JAVA_OPTS supports quoted arguments but does not perform shell expansion.
The local configuration file is:
config/integration-agent.properties
It is created automatically on first startup if missing. Edit the host copy when you need local configuration changes, then restart the container:
docker restart integration-agent
For Compose:
docker compose restart
Normal UI-managed Agents also receive configuration from Etlworks. Use the Etlworks UI for settings managed there; received configuration can affect the effective local values.
Do not rely on watch.configuration.changes=true for live reload in UI-managed operation.
| Property | Default | Purpose |
|---|---|---|
web.server.host | 0.0.0.0 in the Docker image | Dashboard listening address inside the container. |
web.server.port | 8081 | Dashboard port inside the container. |
web.server.enabled | true | Enable the dashboard. |
heartbeat.cron | 3600000 | Agent heartbeat schedule; the default is one hour in milliseconds. |
shutdown.timeout | 300000 | Agent shutdown timeout in milliseconds. |
memory.utilization.high.threshold | 80 | Memory warning threshold, percent. |
memory.utilization.critical.threshold | 90 | Critical memory threshold, percent. |
errors.ratio.high.threshold | 10 | Error-ratio warning threshold, percent. |
errors.ratio.critical.threshold | 25 | Critical error-ratio threshold, percent. |
Email notifications require valid mail.smtp.* settings and the appropriate notification.* flags.
In Java properties files, place comments on separate lines:
# Local dashboard port
web.server.port=8081
The quick-start commands do not publish a port. Publishing the dashboard is optional and is not required for communication with Etlworks.
To make it accessible only from the Docker host, add:
-p 127.0.0.1:8081:8081
For Compose:
ports:
- "127.0.0.1:8081:8081"
If you change web.server.port, update the container-side port in the mapping too.
The image includes bundled JDBC drivers. Startup refreshes the bundled driver folders while retaining additional customer folders.
Place customer-managed drivers in jdbc-custom, preserving the directory structure expected under jdbc.
For example, an overlay file at:
jdbc-custom/<driver-folder>/<driver-file>.jar
is applied to:
jdbc/<driver-folder>/<driver-file>.jar
Use the folder required by the connector. Restart the container after changing drivers.
Premium connectors require their driver and a separate license.
Copy the driver into the host's plugin directory. If the driver requires interactive activation, open a shell as the Agent user:
docker exec -it --user etlworks integration-agent bash
Then run:
cd /opt/etlworks-agent/plugin
java -jar name.of.the.driver.jar -license
Replace the filename with the actual driver filename. Follow the driver vendor's instructions for license activation and persistence.
Restart the container after changing plugin files.
With the updated Java 25 app and Agent, OpenEDI and EDIFACT/X12 credentials can be provisioned through the Etlworks license configuration and delivered to the Agent automatically. They are no longer embedded in the image.
To override provisioned credentials on this Agent, set these properties in the
host's config/integration-agent.properties, then restart the container:
edination.api.key=REPLACE_WITH_OPENEDI_API_KEY
ipworks.edi.license=REPLACE_WITH_IPWORKS_RUNTIME_LICENSE
Nonempty local values override the provisioned defaults. OpenEDI still needs network access to its API endpoint. Offline EDIFACT/X12 execution also requires any non-bundled schemas to be available locally.
docker logs --tail 100 integration-agent
docker logs --follow integration-agent
docker stop --time 360 integration-agent
docker start integration-agent
docker restart integration-agent
Compose equivalents:
docker compose logs --tail 100
docker compose logs --follow
docker compose stop
docker compose start
docker compose restart
Docker updates replace the image. There is no native Agent updater service or native bridge migration inside the container.
Stop the old container with:
docker stop --time 360 integration-agent
After backing up the persistent directories, remove it:
docker rm integration-agent
Then repeat the appropriate docker run command with the replacement image.
Update the image reference in compose.yaml, then pull it:
docker compose pull
docker compose stop
Back up the persistent directories, then recreate the service:
docker compose up -d
docker compose logs --tail 100
Direct Docker and Compose updates do not provide automatic backup restoration or transactional rollback. Retain the previous image reference and your backup until verification is complete.
Older images used /agent inside the container. The Java 25 image uses /opt/etlworks-agent.
/agent/data to /opt/etlworks-agent/data.config, jdbc, jdbc-custom, and backups directories if they were not previously mounted.license directory.JAVA_OPTS for Java 25 compatibility. Memory options such as -Xms and -Xmx remain supported.Do not run the native 9→10 migration scripts inside the container.
On normal startup, the entrypoint populates missing configuration files automatically.
If startup reports that integration-agent.properties is missing, inspect earlier log messages and check whether the mounted directory allows file creation and ownership changes.
Confirm that the downloaded .alic file is in the host directory mounted at:
/opt/etlworks-agent/license
Do not rename it. Restart after correcting the mount or copying the file.
Check the address embedded in the downloaded license and verify that it is reachable from inside the container, including DNS, port, proxy routing, and TLS trust.
localhost inside the container refers to the container itself.Also verify connectivity from the container to the databases, APIs, and other services used by your flows.
Docker health checks confirm that the Agent JVM is present. Check the Agent logs for licensing, authentication, or connectivity errors, and verify status in the Etlworks UI.
Inspect the logs and Docker container state for an out-of-memory condition. Review both the container memory limit and JAVA_OPTS, leaving sufficient space outside the Java heap.
Content type
Image
Digest
sha256:83890e97a…
Size
1.6 GB
Last updated
about 18 hours ago
docker pull etlworks/integration-agent