# Building Custom Ignition Gateway Docker Images

**URL:** <https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899>\
**Category:** Ignition\
**Tags:** docker\
**Created:** [November 3, 2025, 4:36pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899 "2025-11-03T16:36:23Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jacobb](https://avatars.discourse-cdn.com/v4/letter/j/f14d63/32.png) [@jacobb](https://forum.inductiveautomation.com/u/jacobb)\
**Post date:** [November 3, 2025, 4:36pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/1 "2025-11-03T16:36:23Z")

</div>

Hi all,

I’m working on a project where I'd like to build a custom Ignition Gateway Docker image that includes my data directory with my development changes. My goal is for the resulting image to be fully self-contained—so that when I run a container from it, the Gateway starts up with all our customizations and resources in place (tags, projects, etc.). I'm working on a local development environment and trying to get a reproducible image created in CI.

Here’s what I’m doing so far:

- I’m starting from the official Inductive Automation Ignition image (currently using inductiveautomation/ignition:8.3.0).

- I copy our data directory into the image using: `COPY --chown=2003:2003 data /usr/local/bin/ignition/data`

The Ignition process runs as user/group 2003, so I set ownership accordingly.

Problems/Questions:

When I build and run the image, the Gateway doesn’t pick up all the customizations as expected - though it does if I run from the base image with the customizations bound as a volume.

I want to ensure that all files and directories in /usr/local/bin/ignition/data are accessible to the Ignition process.

Are there best practices for copying the data directory and setting permissions/ownership in the Dockerfile?

Is there anything else I should be aware of to make sure the Gateway starts up cleanly with all our development changes included?

Thanks in advance!

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 3, 2025, 4:44pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/2 "2025-11-03T16:44:31Z")

</div>

Don't mount into `/data/`, that's too broad. If you need to load 'gateway config', then mount the things you care about from `/data/config/resources/core/` (on your development system) into the container at the `/data/config/resources/external/` directory. The `external` directory is automatically scanned in on gateway startup and treated as an **immutable** set of resources that the gateway will not ever attempt to make changes to.

Some more context:

> [@Deployment modes override and rename to override with another type?](https://forum.inductiveautomation.com/t/deployment-modes-override-and-rename-to-override-with-another-type/111339/3):
>
> Deployment modes can change anything (though it's not necessarily recommended). If it helps, think of it as a single project inheritance tree. If you're in the dev mode, you're consuming external -\> system -\> core, then whatever dev defines, and then potentially overridden by anything local: Tree External External System System External-\>System Core Core System-\>Core Dev Dev Core-\>Dev Test Test Core-\>Test Prod Prod Core-\>Prod Local Local …

> [@Creating tag groups with the openapi endpoints in the gateway?](https://forum.inductiveautomation.com/t/creating-tag-groups-with-the-openapi-endpoints-in-the-gateway/111633/2):
>
> No, not through the rest API nor directly via scripting at present. It's very poorly documented at present because it's brand new to 8.3, but there is another possible solution to your issue; more on that later. Correct, the entire many file based configuration storage is new to 8.3; prior versions used a SQLite "internal database" to store all configuration and we did not support editing that database directly. For posterity, while you can do this, the address mapping feature is generally …

The project inheritance situation is different, but you should generally follow the same pattern:  
Mount `/data/projects/` (or even individual projects within that folder) - don't try to mount the entire `data/` directory, because Ignition needs to do certain things there related to the runtime that don't make sense to VCS/store outside of the container.

---

<div class="post-metadata">

**Author:** ![richard.simpson](https://avatars.discourse-cdn.com/v4/letter/r/65b543/32.png) [@richard.simpson](https://forum.inductiveautomation.com/u/richard.simpson)\
**Post date:** [November 26, 2025, 2:39pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/3 "2025-11-26T14:39:28Z")

</div>

I feel like this misses the question, or I am confused on what you are asking him/me to do. How I read OP was that he is looking to create a custom image that includes all changes, projects included, to easily release or give that image.

It seems I am missing some config/json/xml file that tells ignition to pick up that project. Even file scan does not show up the project.

The starter container is using 8.3 edge and the current project runs. I would like to take that project and add it to a custom image to make it a quick start container and be ready to go. The vision project does not require any non-base module.

Every copy command I have tried has failed at this. Every time I start up the container, the project is not listed, but I can see the project in the data/projects folder. It seems to have the correct structure.

Specifically, “… then mount the things you care about from .. into the container ..” are you saying to copy via Dockerfile or actually mount?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 1, 2025, 4:19pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/4 "2025-12-01T16:19:12Z")

</div>

Either.

If you want mutable but "seeded" configuration, bake it into a custom docker image - then you're always _starting_ from some base state wherever you deploy, without any requirements from the host.

Or if you want **immutable** configuration, or you want to 'contribute' back out (changes inside the container able to be picked up by the host and presumably passed to VCS or whatever else) then use a bind mount.

> [@richard.simpson](#):
>
> It seems I am missing some config/json/xml file that tells ignition to pick up that project. Even file scan does not show up the project.

An Ignition project is defined as a folder in the `projects/` directory with a (valid) `project.json` manifest file. That's it. Any failure to load/discover a project should be pretty obvious in the gateawy's logs.

---

<div class="post-metadata">

**Author:** ![richard.simpson](https://avatars.discourse-cdn.com/v4/letter/r/65b543/32.png) [@richard.simpson](https://forum.inductiveautomation.com/u/richard.simpson)\
**Post date:** [December 12, 2025, 1:37pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/5 "2025-12-12T13:37:56Z")

</div>

Sorry for the late reply.

I attempted to bake it into a custom docker image, however the gateway did not pick up the project.

I would like to develop using a bound data mount, to ensure if the container was taken down I wouldn’t lose data/progress. However, I want to ‘release’ just the image.

The only way I’ve managed to get the developed project into an image was to overwrite the default ‘edge’ project.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 12, 2025, 4:18pm UTC](https://forum.inductiveautomation.com/t/building-custom-ignition-gateway-docker-images/111899/6 "2025-12-12T16:18:52Z")

</div>

Ah. I did not pick up the mention of Edge in your first post.

Edge (in what I personally contend is a misguided effort) only supports a single _useful_ project at a time. You can change what the name of the Edge project is somewhere buried in the settings; I honestly have no idea what happens if you change the name of the project but already have project data under the new name.
