Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

creating your own docker containers - howto

Featured Replies

I have been trying to figure out how to add my own containers to Unraid and I couldn't find all the docs in one place.  These instructions include creating a docker image, using your own docker registry instead of dockerhub, and incorporating your image into the private apps section of Community Apps where it can be installed and maintained like any other docker container.  I hope this helps someone.

 

The example used here is a QR code generator I made.  It takes a string and when you submit the form it just shows the qrcode image in the browser.  I use the letsencrypt docker to proxy to it.

 

Set up your docker image.  I just use a Dockerfile, I think docker-compose is the more modern way.

Here is the Dockerfile:

FROM node:12.9.1
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY server.js .
EXPOSE 3016
CMD [ "node", "server.js" ]

Here is package.json:

{
  "name": "qrcode",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "qrcode": "^1.4.4"
  }
}

Here is server.js:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
const QRCode = require('qrcode')

app.post('/qr/qrpost', (req, res) => {
        QRCode.toDataURL(req.body.qrstring, (err, image) => {
                const arr = image.split(/,/);
                const buf = Buffer.from(arr[1], 'base64');

                res.set({ 'Content-Type': 'image/png'});
                res.send(buf);
        });
});

app.listen(3016);

Create a docker image for this:

docker build -t yourname/qrcode .

If you wanted to run it and test it you would do:

docker run --net=yourprivatenet -h qrcode --name qrcode -d yourname/qrcode

At this point you could just be done.  The container will work fine, and you can see it in the Docker tab in Unraid.  You just can't do much with it from there.  I wanted to have my own containers controlled through the Unraid interface just like containers installed from Community Apps.

 

If you continue make sure you get the container id from docker ps and then:

docker stop $id && docker rm $id

I wanted to maintain my own docker registry instead of using dockerhub.  If your image is on dockerhub then you can skip this part:

 

Save this xml into a file called registry.xml.  (The icon is bogus, sorry.  I am too lazy to put the right one.)

<?xml version="1.0" encoding="utf-8"?>
<Container>
<Beta>False</Beta>
<Category>HomeAutomation:</Category>
<Date>2020-04-01</Date>
<Changes>
[b]1.APR.2020:[/b]Added[br]
</Changes>
<Support>https://docs.docker.com/registry/</Support>
<Name>Docker Registry Docker</Name>
<Description>
The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.[br][br]
This is the from the Docker team - I just created the template.[br][br]
</Description>
<Registry>https://docs.docker.com/registry/</Registry>
<GitHub>https://github.com/</GitHub>
<Repository>registry:2</Repository>
<BindTime>true</BindTime>
<Privileged>false</Privileged>
<Networking>
  <Mode>bridge</Mode>
  <Publish>
    <Port>
      <HostPort>5000</HostPort>
      <ContainerPort>5000</ContainerPort>
      <Protocol>tcp</Protocol>
    </Port>
  </Publish>
</Networking>
<Data>
  <Volume>
    <HostDir>/mnt/cache/appdata/DockerRegistry</HostDir>
    <ContainerDir>/var/lib/registry</ContainerDir>
    <Mode>rw</Mode>
  </Volume>
</Data>
<Banner>http://i.imgur.com/zXpacAF.png</Banner>
<Icon>http://i.imgur.com/zXpacAF.png</Icon>
</Container>

Create a directory on the usb stick that community apps will use (I'm actually not sure if this persists through reboots and Unraid upgrades):

mkdir -p /boot/config/plugins/community.applications/private/myrepo

Then copy that xml there:

cp registry.xml /boot/config/plugins/community.applications/private/myrepo

Now when you go to the Apps tab in Unraid you will see Private Apps on the left side.  Install the registry you set up there with defaults.  You can change the port from 5000 if you are already using it for something else.  Just remember to change 5000 in later instructions to that port.

 

Tag your qrcode (or whatever) image and push it to your registry:

docker image tag yourname/qrcode localhost:5000/qrcode
docker push localhost:5000/qrcode

(I think it is probably safe to docker rmi $imageid to remove the image you created earlier since it is now in your own registry.  I didn't test that yet.)

 

In the rest of the instructions that is how you refer to the image.  So if you had it uploaded to dockerhub it would be yourname/qrcode but if you have it in your own registry it would be localhost:5000/qrcode.

 

Now you create an xml file for your app, qrcode.xml or whatever.  Edit it for your app:  (Again, the icon is bogus.  Use a proper icon.)

<?xml version="1.0" encoding="utf-8"?>
<Container>
<Beta>False</Beta>
<Category>HomeAutomation:</Category>
<Date>2020-04-01</Date>
<Changes>
[b]1.APR.2020:[/b]Added[br]
</Changes>
<Support>http://forums.unraid.net</Support>
<Name>QRcode</Name>
<Description>
QRcode will take a string and return the QRcode image[br][br]
QRcode will run on port 3016.[br][br]
</Description>
<Registry>http://unraid:5000/qrcode/</Registry>
<GitHub>https://github.com/</GitHub>
<Repository>localhost:5000/qrcode</Repository>
<BindTime>true</BindTime>
<Privileged>false</Privileged>
<Networking>
  <Mode>bridge</Mode>
  <Publish>
    <Port>
      <HostPort>3016</HostPort>
      <ContainerPort>3016</ContainerPort>
      <Protocol>tcp</Protocol>
    </Port>
  </Publish>
</Networking>
<WebUI>http://[IP]:[PORT:3016]</WebUI>
<Banner>http://i.imgur.com/zXpacAF.png</Banner>
<Icon>http://i.imgur.com/zXpacAF.png</Icon>
</Container>

Copy that xml to where Community Apps can find it:

cp qrcode.xml /boot/config/plugins/community.applications/private/myrepo

Reload that tab.  Install your app (set the network to your private net).  Done.  Whew.  So much hassle, haha.  Good luck!

 

And I'm already back.  I forgot, if you actually want to try out the qrcode app you will need this qrcode.html:

<html><head></head><body>
Enter string to qrencode:<br>
<form action='/qr/qrpost' method='POST'>
  <input type='text' name='qrstring' id='qrstring'/>
</form>
</body></html>

Copy that to your letsencrypt nginx document root:

cp qrcode.html /mnt/user/appdata/letsencrypt/www

And the qrcode.subfolder.conf

location ^~ /qr/qrpost {
    include /config/nginx/proxy.conf;
    resolver 127.0.0.11 valid=30s;
    proxy_pass http://QRcode:3016;
}

Copy that to your letsencrypt nginx proxy-confs:

cp qrcode.subfolder.conf /mnt/user/appdata/letsencrypt/nginx/proxy-confs

And restart your letsencrypt docker.  Go to yoursite.com/qrcode.html, type in some words and hit enter to submit.  Voila!

 

I apologize for any mistakes.  Let me know so I can fix them.

Edited by uek2wooF
made first paragraph more descriptive. fixed port number

  • 4 weeks later...
  • Author

So the question now is how to do updates to the app.  I did a new image build with docker build, did the tag and push so it is in the repo, but I don't know what to do so it can be upgraded with community applications.  Any ideas?

  • 2 years later...

are you still working on figuring it out? Ive been wondering as well, since some apps just have badly updated containers in the CA.

On 4/30/2020 at 7:04 AM, uek2wooF said:

So the question now is how to do updates to the app.  I did a new image build with docker build, did the tag and push so it is in the repo, but I don't know what to do so it can be upgraded with community applications.  Any ideas?

 

  • Community Expert

You don't need to do anything beyond pushing to the registry, CA will check that and offer the update.

  • Author
3 hours ago, Kilrah said:

You don't need to do anything beyond pushing to the registry, CA will check that and offer the update.

 

Hmm.  It just says version not available in the version column on the docker tab for my qrcode docker.

  • Community Expert

Is your registry container running? Should just work. What happens if you switch the docker page to advanced and click force update? That'll pop the docker output so may give some hints about what goes wrong

 

Notes for others reading this, the Docker registry is in CA, no (more?) need to make your own template for it. 

  • Author

I use the "DockerRegistryDocker" and yes it is running.  After "force update" the commands run successfully and it says up-to-date, but then if I check for updates it says "not available" again.  I am not sure what is going on behind the scenes so it is hard to troubleshoot this.

 

When you say a template is not needed, are you talking about that registry.xml?  Without it I don't get my repo in the private repositories in community apps (6.9.2).

  • Community Expert
16 minutes ago, uek2wooF said:

When you say a template is not needed, are you talking about that registry.xml?  Without it I don't get my repo in the private repositories in community apps

Correct. You would obviously want your qrcode.xml in there but registry isn't needed since it's available in CA, at least on 6.10.

  • 1 year later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.