New Docker Image for CGWire

Hello all,

We are glad to announce the release of our official Docker image. Thanks to the work of @marcus, @manu and Pilou we have been able to publish our image on the Docker Hub repository. This image is aimed at trial purpose. It allows you to test the whole CGWire stack (Kitsu and Zou) by running a single command line. It just requires that you have a Docker installation up and ready.

Run this command:

docker run -d -p 80:80 --name cgwire cgwire/cgwire

Then you will be able to try Kitsu and Zou by requesting http://localhost and http://localhost/api .

Docker Hub Page : https://hub.docker.com/r/cgwire/cgwire/
Source code : https://github.com/cgwire/cgwire

Once again, we will be glad to have your feedback, feel free to tell us what you think about it!

NB: Docker is a container management solution which allows you to deploy software isolated from the host machine. To make it short, it allows you to run quickly programs that need complex installation without compromising your Operating System.

images

1 Like

Finally!

I know the answer to this, but maybe put in a few words about why this isn’t as-is suitable for production, versus using Docker Compose? For example, what happens to data put into it? What happens when the container is stopped, killed and/or removed?

Also, once it’s up and running, how do you setup a user account? I noticed the information on the cgwire GitHub page, maybe it could be worth repeating here for anyone stumbling past this thread first.

Actually, the credentials doesn’t seem to work…

image

Can you check you are using the latest version ?

$ docker image inspect --format '{{ .Id }}' cgwire/cgwire
sha256:db626e29b06875c3ae93d14504294b22cd0d4f5f9ab30ae05819685bf92974ff

$ docker container inspect --format '{{ .Image }}' cgwire
sha256:db626e29b06875c3ae93d14504294b22cd0d4f5f9ab30ae05819685bf92974ff

Email address of admin user can be displayed with:
$ docker exec -it cgwire su -l postgres -c "psql -d zoudb -c \"select email from person where role='admin';\""

Note that default admin account can be recreated using:

docker exec -it cgwire /opt/zou/env/bin/zou create_admin admin@example.com

Hi @Pilou (not Pilou at Framestore are you?) :open_mouth:

$ docker image inspect --format '{{ .Id }}' cgwire/cgwire
sha256:db626e29b06875c3ae93d14504294b22cd0d4f5f9ab30ae05819685bf92974ff
$ docker container inspect --format '{{ .Image }}' cgwire
sha256:db626e29b06875c3ae93d14504294b22cd0d4f5f9ab30ae05819685bf92974ff

The next one threw an error.

$ docker exec -it cgwire su -l postgres -c "psql -d zoudb -c \"select email from person where role='admin';\""
psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

And get ready for the big one…

$ docker exec -it cgwire /opt/zou/env/bin/zou create_admin admin@example.com
Traceback (most recent call last):
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1122, in _do_get
    return self._pool.get(wait, self._timeout)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/queue.py", line 145, in get
    raise Empty
sqlalchemy.util.queue.Empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 2147, in _wrap_pool_connect
    return fn()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 387, in connect
    return _ConnectionFairy._checkout(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 766, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 516, in checkout
    rec = pool._do_get()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1138, in _do_get
    self._dec_overflow()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1135, in _do_get
    return self._create_connection()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 333, in _create_connection
    return _ConnectionRecord(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 461, in __init__
    self.__connect(first_connect_check=True)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 651, in __connect
    connection = pool._invoke_creator(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect
    return dialect.connect(*cargs, **cparams)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 393, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/opt/zou/env/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/zou/env/bin/zou", line 4, in <module>
    __import__('pkg_resources').run_script('zou==0.3.3', 'zou')
  File "/opt/zou/env/lib/python3.5/site-packages/pkg_resources/__init__.py", line 750, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/opt/zou/env/lib/python3.5/site-packages/pkg_resources/__init__.py", line 1524, in run_script
    exec(code, namespace, namespace)
  File "/opt/zou/env/lib/python3.5/site-packages/zou-0.3.3-py3.5.egg/EGG-INFO/scripts/zou", line 129, in <module>
    manager.run()
  File "/opt/zou/env/lib/python3.5/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/opt/zou/env/lib/python3.5/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/opt/zou/env/lib/python3.5/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/opt/zou/env/lib/python3.5/site-packages/zou-0.3.3-py3.5.egg/EGG-INFO/scripts/zou", line 58, in create_admin
    role="admin"
  File "/opt/zou/env/lib/python3.5/site-packages/zou-0.3.3-py3.5.egg/zou/app/services/persons_service.py", line 33, in create_person
    role=role
  File "/opt/zou/env/lib/python3.5/site-packages/zou-0.3.3-py3.5.egg/zou/app/models/base.py", line 67, in create
    db.session.commit()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/scoping.py", line 157, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 906, in commit
    self.transaction.commit()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 461, in commit
    self._prepare_impl()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 441, in _prepare_impl
    self.session.flush()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2171, in flush
    self._flush(objects)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2291, in _flush
    transaction.rollback(_capture_exception=True)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2255, in _flush
    flush_context.execute()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 389, in execute
    rec.execute(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 548, in execute
    uow
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 156, in save_obj
    base_mapper, states, uowtransaction
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 279, in _organize_states_for_save
    states):
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 1105, in _connections_for_states
    connection = uowtransaction.transaction.connection(base_mapper)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 294, in connection
    return self._connection_for_bind(bind, execution_options)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 392, in _connection_for_bind
    conn = self._parent._connection_for_bind(bind, execution_options)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 403, in _connection_for_bind
    conn = bind.contextual_connect()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 2112, in contextual_connect
    self._wrap_pool_connect(self.pool.connect, None),
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 2151, in _wrap_pool_connect
    e, dialect, self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1465, in _handle_dbapi_exception_noconnection
    exc_info
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
    raise value.with_traceback(tb)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 2147, in _wrap_pool_connect
    return fn()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 387, in connect
    return _ConnectionFairy._checkout(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 766, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 516, in checkout
    rec = pool._do_get()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1138, in _do_get
    self._dec_overflow()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1135, in _do_get
    return self._create_connection()
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 333, in _create_connection
    return _ConnectionRecord(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 461, in __init__
    self.__connect(first_connect_check=True)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/pool.py", line 651, in __connect
    connection = pool._invoke_creator(self)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect
    return dialect.connect(*cargs, **cparams)
  File "/opt/zou/env/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 393, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/opt/zou/env/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

I had a feeling this may be due to my version of Docker, called Docker Toolbox, which runs within a VM (VirtualBox). So I gave it a try on Docker running directly on Linux (Ubuntu 16.10), which worked and I could login from there.

How can I change the default password, or delete the example user so I could add a new?

(If not Framestore, is it Pilou as in author of Verve?)

The PostgreSQL database isn’t running.

Database can be started with:

$ docker exec -it cgwire supervisorctl start postgresql

Status of PostgreSQL service can be checked with:

$ docker exec -it cgwire supervisorctl status postgresql

PostgreSQL logs can be displayed with:

$ docker exec -it cgwire cat /var/log/postgresql/postgresql-9.5-main.log

Once PostgreSQL service is running, authentication should work. Then you could change the default password / email using the web interface.

not Pilou at Framestore :slight_smile:

Here’s what I get.

$ docker exec -it cgwire supervisorctl start postgresql
postgresql: ERROR (spawn error)

Oh and I should have mentioned, this is from Docker running on Windows, via Docker Toolbox, which as I mentioned is a Linux VM running under VirtualBox. And again, the original instructions work well on Docker running under Linux.

I can’t say why it would work differently however, I’ve never encountered this before and I’ve built and started hundreds of images cross-platform in this way. My original cgwire Docker image was built on Windows too.

Some potentially useful debug information.

$ docker logs cgwire -t -f
2017-11-15T11:27:48.847839624Z Running with existing database in /var/lib/postgresql
2017-11-15T11:27:48.855850399Z Running Zou...
2017-11-15T11:27:49.013973561Z 2017-11-15 11:27:49,013 CRIT Supervisor running as root (no user in config file)
2017-11-15T11:27:49.024583083Z 2017-11-15 11:27:49,023 INFO RPC interface 'supervisor' initialized
2017-11-15T11:27:49.024601085Z 2017-11-15 11:27:49,024 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2017-11-15T11:27:49.024606002Z 2017-11-15 11:27:49,024 INFO supervisord started with pid 10
2017-11-15T11:27:50.027872710Z 2017-11-15 11:27:50,026 INFO spawned: 'gunicorn' with pid 13
2017-11-15T11:27:50.028862138Z 2017-11-15 11:27:50,028 INFO spawned: 'gunicorn-events' with pid 14
2017-11-15T11:27:50.032872480Z 2017-11-15 11:27:50,032 INFO spawned: 'redis' with pid 15
2017-11-15T11:27:50.034861845Z 2017-11-15 11:27:50,034 INFO spawned: 'postgresql' with pid 16
2017-11-15T11:27:50.045390634Z 2017-11-15 11:27:50,044 INFO spawned: 'nginx' with pid 17
2017-11-15T11:27:50.191979931Z 2017-11-15 11:27:50,191 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T11:27:51.194169901Z 2017-11-15 11:27:51,193 INFO success: gunicorn entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-11-15T11:27:51.194189107Z 2017-11-15 11:27:51,193 INFO success: gunicorn-events entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-11-15T11:27:51.194194029Z 2017-11-15 11:27:51,193 INFO success: redis entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-11-15T11:27:51.195658934Z 2017-11-15 11:27:51,194 INFO spawned: 'postgresql' with pid 36
2017-11-15T11:27:51.195671322Z 2017-11-15 11:27:51,194 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-11-15T11:27:51.295245139Z 2017-11-15 11:27:51,294 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T11:27:53.298664087Z 2017-11-15 11:27:53,297 INFO spawned: 'postgresql' with pid 41
2017-11-15T11:27:53.352694089Z 2017-11-15 11:27:53,352 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T11:27:56.357566642Z 2017-11-15 11:27:56,357 INFO spawned: 'postgresql' with pid 48
2017-11-15T11:27:56.371897691Z 2017-11-15 11:27:56,371 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T11:27:57.372968214Z 2017-11-15 11:27:57,372 INFO gave up: postgresql entered FATAL state, too many start retries too quickly
2017-11-15T14:27:14.410956118Z 2017-11-15 14:27:14,410 INFO spawned: 'postgresql' with pid 75
2017-11-15T14:27:14.560709270Z 2017-11-15 14:27:14,560 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T14:27:15.564228916Z 2017-11-15 14:27:15,563 INFO spawned: 'postgresql' with pid 76
2017-11-15T14:27:15.576664407Z 2017-11-15 14:27:15,576 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T14:27:17.584393427Z 2017-11-15 14:27:17,582 INFO spawned: 'postgresql' with pid 77
2017-11-15T14:27:17.595877034Z 2017-11-15 14:27:17,595 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T14:27:20.601435160Z 2017-11-15 14:27:20,601 INFO spawned: 'postgresql' with pid 78
2017-11-15T14:27:20.615126737Z 2017-11-15 14:27:20,614 INFO exited: postgresql (exit status 1; not expected)
2017-11-15T14:27:21.616613601Z 2017-11-15 14:27:21,616 INFO gave up: postgresql entered FATAL state, too many start retries too quickly

Just took this for a spin. +1 for these easy to use Docker images, and +2 for production Docker images :slight_smile:

Was meet with something that look like a bug:

Capture

This half screen on a 1920x1080 screen. When you expand to full screen the button text appears:

Capture

Sorry if you have already covered these questions and requests.
I like to flag everything I can think of, before I get too used to an application.

  • Maybe you should be able to sort the “Task Types” by “Priority” and “For”. If you don’t want to add functionality for sorting, then maybe just have to sorted by “For” then “Priority” then “Name”, for a better overview of the production pipeline.
  • When adding a task type, the “Priority” is a dropdown menu. Should this not be a spinner for integer inputs?
  • Sorry for being an idiot user, but you seem to be able to add duplicate episodes/sequences/shots, though its seems to sort itself out when you refresh the page:
    Capture
  • Might be nice with an autosave option on the breakdown page.
  • Can you assign an asset to a episode/sequence or multiple shots at one time?
  • Seems like you have to have an episode to create a shot? Can you not work purely with sequences/shots or even just shots?
  • I seem to be missing something to add tasks?

Thank you again @tokejepsen for the feedback, it is very helpful. But, I have something to ask to you. Can you open a new topic with your feedback? It is not related to the Docker image, so it may be confusing for visitors. Then I will answer to your questions in this new topic.

Good point :slight_smile: https://forum.cg-wire.com/t/kitsu-feedback/50

You still put “Docker” in the title though, I think what Frank is saying is that the issues aren’t related to Docker at all. :slight_smile:

Was minimum of 15 character limitation on the title, and that was the first thing that sprung to mind :slight_smile:
Changed now.

Ah right, I hate those things. Note to Frank, remove those silly limits. Including the ones in messages. It’s first thing I turn off on my forums.

I lower down the limit. Thx @marcus for the suggestion and the Docker image feedback.

About the windows incompatibility can you open an issue? We cannot afford to spend too much time on a non standard platform right now. We will come back to this later.

@marcus, maybe not a viable option for you to test this, but Windows 10 and Hyper-V works for me.

1 Like

It’s no problem for me personally, it was more of a bug report than a problem I was looking to have solved. I’ve got it up and running on a vanilla Linux machine and all is working well.

As for Hyper-V, that’s actually good news; that’s the newer, default and promoted method of running Docker on Windows. Which means this would only ever be a problem for the small minority running the old “Docker Toolbox” (which is necessary in order to run non-Hyper-V machines in parallel, via e.g. VMWare Workstation and VirtualBox that doesn’t function when Hyper-V is enabled).

1 Like

PostgreSQL is unable to start, could you paste output of the command below ?

$ docker exec -it cgwire cat /var/log/postgresql/postgresql-9.5-main.log

No space left on device

There it is!

$ docker exec -it cgwire cat /var/log/postgresql/postgresql-9.5-main.log
2017-11-14 20:35:22 UTC [21-1] LOG:  could not bind IPv6 socket: Cannot assign requested address
2017-11-14 20:35:22 UTC [21-2] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2017-11-14 20:35:22 UTC [22-1] LOG:  database system was shut down at 2017-11-14 20:32:04 UTC
2017-11-14 20:35:22 UTC [22-2] LOG:  MultiXact member wraparound protections are now enabled
2017-11-14 20:35:22 UTC [21-3] LOG:  database system is ready to accept connections
2017-11-14 20:35:22 UTC [26-1] LOG:  autovacuum launcher started
2017-11-14 20:35:23 UTC [28-1] [unknown]@[unknown] LOG:  incomplete startup packet
2017-11-14 20:35:26 UTC [21-4] LOG:  received fast shutdown request
2017-11-14 20:35:26 UTC [21-5] LOG:  aborting any active transactions
2017-11-14 20:35:26 UTC [26-2] LOG:  autovacuum launcher shutting down
2017-11-14 20:35:26 UTC [23-1] LOG:  shutting down
2017-11-14 20:35:26 UTC [23-2] LOG:  database system is shut down
2017-11-14 20:35:42 UTC [21-1] LOG:  could not bind IPv6 socket: Cannot assign requested address
2017-11-14 20:35:42 UTC [21-2] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2017-11-14 20:35:42 UTC [22-1] LOG:  database system was shut down at 2017-11-14 20:35:26 UTC
2017-11-14 20:35:42 UTC [22-2] LOG:  MultiXact member wraparound protections are now enabled
2017-11-14 20:35:42 UTC [21-3] LOG:  database system is ready to accept connections
2017-11-14 20:35:42 UTC [26-1] LOG:  autovacuum launcher started
2017-11-14 20:35:43 UTC [29-1] [unknown]@[unknown] LOG:  incomplete startup packet
2017-11-14 20:36:03 UTC [21-4] LOG:  received fast shutdown request
2017-11-14 20:36:03 UTC [21-5] LOG:  aborting any active transactions
2017-11-14 20:36:03 UTC [26-2] LOG:  autovacuum launcher shutting down
2017-11-14 20:36:03 UTC [23-1] LOG:  shutting down
2017-11-14 20:36:03 UTC [23-2] LOG:  database system is shut down
2017-11-15 11:27:50 UTC [16-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 11:27:51 UTC [36-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 11:27:53 UTC [41-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 11:27:56 UTC [48-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 14:27:14 UTC [75-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 14:27:15 UTC [76-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 14:27:17 UTC [77-1] FATAL:  could not create lock file "postmaster.pid": No space left on device
2017-11-15 14:27:20 UTC [78-1] FATAL:  could not create lock file "postmaster.pid": No space left on device

I cleared up some space, and now it all works well.

This is a rare problem in general, but common in my experience and I think for anyone running Docker on Mac or Windows under VirtualBox, as it isn’t obvious how much space is left on the virtual machine hosting Docker. I also noticed that Docker on Windows without Toolbox only works on Windows 10 Pro and above, so it’s possible most trying this on Windows to be affected by this problem.

Nice detective work, and thanks for your patience!