Install Discourse for development using Docker


I have managed to install Discourse on Windows using WSL.

Prerequisites that i have done.

  • Enable WSL with version 2
  • I am using Ubuntu 20.04
  • Set up your distribution :slight_smile: Follow the given instructions and you are ready to go

In the distribution, under my home home folder, /home/cosmin.

  • Install Docker as instructed in the first post. The installation part of was not necessary for me. I only executed sudo usermod -a -G docker $USER
  • After the Docker installation is complete, start the service with sudo docker service start and check it
  • cd discourse
  • Run d/boot_dev --init and wait to finish
  • Run in discourse folder, run d/unicorn and you are ready yo go

If the commands are reporting permissions error, try with sudo

Hope this helps :slight_smile:
Have a nice day or evening!


Thanks for sharing your setup; however, I don’t have Windows. I’m specifically curious about the one-click Digital Ocean setup – is it suitable for development?

1 Like


I’m getting this error when trying to run d/boot_dev --init

Errno::EACCES: Permission denied @ dir_s_mkdir - tmp
/src/config/boot.rb:23:in `<top (required)>'
/src/config/application.rb:16:in `require'
/src/config/application.rb:16:in `<top (required)>'
/src/Rakefile:7:in `require'
/src/Rakefile:7:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)

Any ideas on how I fix it? Tried searching for it everywhere but didn’t find any solutions.

Edit: fixed it by doing chmod -R 777 ~/discourse, but now I’m getting this error:

gifsicle worker: gifsicle not found; please provide proper binary or disable this worker (--no-gifsicle argument or :gifsicle => false through options)


That is not an issue, we removed our usage recently, the warning is not a concern. Are you working against old Discourse code?


Nope, it was the recent release. But I followed this DigitalOcean’s tutorial and it’s perfectly working now.


How to use plugins in this kind of setup?
I am trying to follow Install Plugins in Discourse, but it mentions /var/discourse/containers/app.yml file, which does not exist in my discourse directory.

I’ve got building a discourse dev environment working and able to test my patch, but how do I get my patch into my production instance? I tried building base, and then ./launcher rebuild app --run-image discourse/base:build, but it doesn’t seem to result in a running Discourse instance.

Usually I get an error about the syslog group missing, but I commented that out, and still didn’t end up with a running site. And nothing of note in docker logs.

We don’t really document this kind of stuff, but you would generate a “diff” file, the git apply the diff in a hook after you clone the repo. app.yml supports hooks.

A quick-and-dirty solution for self hosted single container things is just to edit the code in place and run sv restart unicorn


Not sure if this is the best place to ask about this problem but I’ve been unable to finish the Discourse installation using Docker on an Apple M1 computer.

After I run d/boot_dev --init all dependencies are installed without any apparent problem but once I get to the Migrating database step, it stays there consuming 100% of one of my cores and it doesn’t seem to move from there.

I tried logging in to the docker container and the bundle migrate task is running at 100% but no apparent activity on the posgresql process.

Any ideas would be very helpful!

1 Like

I think the virtualization support is really really new, not surprised it is a bit of an adventure.

@pmusaraj / @david any luck getting docker-dev working on m1?


I haven’t tried it yet.


If anyone is able to run Discourse using docker in a M1 Mac, please let me know. In the mean time, I’ll try to follow the other guide! Thank you!

1 Like

I tried briefly today, and got stuck at the same step as you, but with an error:

Invalid gemspec in [/usr/local/lib/ruby/gems/2.7.0/specifications/default/zlib-1.1.0.gemspec]: Malformed version number string specification_version
bundler: failed to load command: rake (/usr/local/bin/rake)

Yes, please do. There are multiple team members using Discourse on M1 (myself included) every day, so it works quite well!

Let us know if you run into any issues.


Thank you very much for your time and help! At least I’m not the only one stuck with it.

Hi, i think we should make a description about the Ember-CLI here, and a shourcut for below command without enter into docker container.

And i can’t get it work by execute above commands into container, seems container didn’t expose the 4200 port.

Manual expose the port 4200 by edit d/boot_dev:
Screenshot from 2021-05-02 16-09-16

After reboot container I access localhost:4200 got this:

discourse@discourse:/tmp$ cat error.dump.cab4cc444229d44fc0fce2deb8695880.log 

ENV Summary:

  TIME: Sun May 02 2021 08:01:12 GMT+0000 (Coordinated Universal Time)
  TITLE: ember
  - /usr/bin/node
  - /src/app/assets/javascripts/node_modules/.bin/ember
  - server
  - --proxy
  - http://localhost:3000
  EXEC_PATH: /usr/bin/node
  TMPDIR: /tmp
  SHELL: /bin/bash
  - /tmp/yarn--1619942449179-0.1910991449592403
  - /src/app/assets/javascripts/discourse/node_modules/.bin
  - /home/discourse/.config/yarn/link/node_modules/.bin
  - /src/app/assets/javascripts/node_modules/.bin
  - /home/discourse/.yarn/bin
  - /usr/libexec/lib/node_modules/npm/bin/node-gyp-bin
  - /usr/lib/node_modules/npm/bin/node-gyp-bin
  - /usr/bin/node_modules/npm/bin/node-gyp-bin
  - /usr/local/sbin
  - /usr/local/bin
  - /usr/sbin
  - /usr/bin
  - /sbin
  - /bin
  PLATFORM: linux x64
  FREEMEM: 8603062272
  TOTALMEM: 41962496000
  UPTIME: 612639
  LOADAVG: 3.32177734375,2.19580078125,1.47900390625
  - Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - 3301
  - Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - 3300
  - Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - 3300
  - Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz - 3301
  - ares: 1.15.0
  - brotli: 1.0.7
  - cldr: 35.1
  - http_parser: 2.9.3
  - icu: 64.2
  - modules: 64
  - napi: 7
  - nghttp2: 1.41.0
  - node: 10.23.0
  - openssl: 1.1.1g
  - tz: 2019c
  - unicode: 12.1
  - uv: 1.34.2
  - v8:
  - zlib: 1.2.11

ERROR Summary:

  - broccoliBuilderErrorStack: [undefined]
  - codeFrame: [undefined]
  - errorMessage: connect ECONNREFUSED
  - errorType: [undefined]
  - location:
    - column: [undefined]
    - file: [undefined]
    - line: [undefined]
  - message: connect ECONNREFUSED
  - name: Error
  - nodeAnnotation: [undefined]
  - nodeName: [undefined]
  - originalErrorMessage: [undefined]
  - stack: Error: connect ECONNREFUSED
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)


After edit bin/ember-cli PORT to 3000 to 9292 all working.

Seems the ember-cli bash unable work with ENV["UNICORN_PORT"] .

1 Like

The Ember CLI is a new (and hard fought) development; @eviltrout should be able to comment on that soon.


Yes this will have to be updated. In the meantime you can disable that by setting the NO_EMBER_CLI environment variable to 1.


Probably obvious but could you clarify where you set the env variable @eviltrout ?

I tried in the d/unicorn file like this:

docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" -e NO_EMBER_CLI=1

…but that didn’t work (still getting " Ember CLI is Required in Development Mode" message at localhost:9292).

d/boot_dev -e NO_EMBER_CLI=1

I tried this today, and also ran into issues. The error I saw was because Docker’s architecture emulation doesn’t support inotify (which we use a lot in Discourse development). For now, I’ve added a warning to d/boot_dev when a non-x86_64 architecture is detected:

❯ d/boot_dev 
WARNING: Docker architecture is not x86_64.
Discourse development is unlikely to work using Docker's architecture emulation.
Please try a native development installation.

I’ve now added a d/ember-cli helper, and forwarded port 4200 by default. The info at the top of this topis has also been updated. Once you’ve updated, run d/rails s in one terminal, and d/ember-cli in another. I’ve also set NO_EMBER_CLI as one of the variables which is passed through to Docker, so that is available if needed.