TL;DR
A growing body of experience building containers on Windows 10 systems (using the Docker Toolbox for Windows) indicates that Docker Toolbox for Windows (on Win10 at minimum) is not a supportable combination for our project at present. It appears that the command in docker-compose.yml cannot be found – at least in cases where the called script is stored in a directory inside the container.
While there may be some adjustment that could be made to support both Windows and *NIX hosts in this scenario, it’s yet another incompatibility we’ve encountered (among many) that only crops up when using Windows as the host, and our team has to focus its cycles on supporting the majority of our project’s developers (who aren’t on Windows).
Problem
One of my colleagues on the project reported the following error when bringing up the Docker container from this branch in this repo. He’s using Windows 10, Docker Toolbox for Windows:
user@DESKTOP MINGW64 /c/develop/python/team-budget/budget_proj (dockerize) $ docker-compose up Starting budgetproj_web_1 ERROR: for web Cannot start service web: oci runtime error: container_linux.go:247: starting container process caused "exec: \"/code/docker-entrypoint.sh\": stat /code/docker-entrypoint.sh: no such file or directory" ERROR: Encountered errors while bringing up the project.
I explained that as far as I understand Docker engine and Docker Toolbox (which hosts the engine in a Virtualbox VM), what’s going on is that inside the container, Docker is trying to execute /code/docker-entrypoint.sh – so theoretically there should be no reason why this would behave any differently on Windows than Mac or Linux, since the runtime environment inside the Docker container shouldn’t know anything about its underlying host’s environment. I know for sure it’s working well on Mac and Linux, even on my personal Mac that’s running the Docker Toolbox.
Investigation
Budget repo on Windows: fails
I attempted this myself with the same branch/repo using Docker Toolbox for Windows (downloaded today, running v1.13.1 of Docker engine) on Windows 10 (Anniversary update), and received effectively the same result:
... Step 12/12 : WORKDIR /code ---> 37cb2ce39964 Removing intermediate container af6440be2e49 Successfully built 37cb2ce39964 WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating budgetproj_web_1 Attaching to budgetproj_web_1 web_1 | standard_init_linux.go:178: exec user process caused "no such file or directory" budgetproj_web_1 exited with code 1
Budget repo on Mac: succeeds
The same commit from the same branch/repo on OS X 10.11 with Docker Toolbox for Mac:
... Step 12/12 : WORKDIR /code ---> 0da697ffe35c Removing intermediate container d4df9c99e8f9 Successfully built 0da697ffe35c Recreating budgetproj_web_1 Attaching to budgetproj_web_1 web_1 | Operations to perform: web_1 | Apply all migrations: admin, auth, budget_app, contenttypes, sessions web_1 | Running migrations: web_1 | Applying contenttypes.0001_initial... OK web_1 | Applying auth.0001_initial... OK web_1 | Applying admin.0001_initial... OK web_1 | Applying admin.0002_logentry_remove_auto_add... OK web_1 | Applying contenttypes.0002_remove_content_type_name... OK web_1 | Applying auth.0002_alter_permission_name_max_length... OK web_1 | Applying auth.0003_alter_user_email_max_length... OK web_1 | Applying auth.0004_alter_user_username_opts... OK web_1 | Applying auth.0005_alter_user_last_login_null... OK web_1 | Applying auth.0006_require_contenttypes_0002... OK web_1 | Applying auth.0007_alter_validators_add_error_messages... OK web_1 | Applying auth.0008_alter_user_username_max_length... OK web_1 | Applying budget_app.0001_initial... OK web_1 | Applying budget_app.0002_auto_20170221_0359... OK web_1 | Applying sessions.0001_initial... OK web_1 | [2017-03-01 21:42:05 +0000] [10] [INFO] Starting gunicorn 19.6.0 web_1 | [2017-03-01 21:42:05 +0000] [10] [INFO] Listening at: http://0.0.0.0:8000 (10) web_1 | [2017-03-01 21:42:05 +0000] [10] [INFO] Using worker: sync
So I tried this on a couple of other of our organization’s projects.
Housing repo on Windows: fails
Housing-17 under Docker Toolbox for Windows on Windows 10:
$ docker-compose up --build Building web Step 1/6 : FROM python:3.5 ---> 4e5ed9f6613e Step 2/6 : ENV PYTHONUNBUFFERED 1 ---> Using cache ---> a62a6ae73cec Step 3/6 : ADD ./requirements.txt /provision/ ---> Using cache ---> 9f34a7d35294 Step 4/6 : WORKDIR /provision/ ---> Using cache ---> 4e06b4c2249f Step 5/6 : RUN pip install -r requirements.txt ---> Using cache ---> e96a581fc549 Step 6/6 : WORKDIR /code/ ---> Using cache ---> fc61cc36c06f Successfully built fc61cc36c06f Starting housing17_db_1 Starting housing17_web_1 Attaching to housing17_db_1, housing17_web_1 db_1 | LOG: database system was shut down at 2017-03-01 19:38:08 UTC db_1 | LOG: MultiXact member wraparound protections are now enabled db_1 | LOG: database system is ready to accept connections web_1 | standard_init_linux.go:178: exec user process caused "no such file or directory" housing17_web_1 exited with code 1
Housing repo on Mac: succeeds
Housing-17 under Docker Toolbox for Mac on OS X 10.11:
... Step 6/6 : WORKDIR /code/ ---> Using cache ---> f79cbc2964cb Successfully built f79cbc2964cb Starting housing17_db_1 Starting housing17_web_1 Attaching to housing17_db_1, housing17_web_1 db_1 | LOG: database system was shut down at 2017-03-01 03:26:27 UTC db_1 | LOG: MultiXact member wraparound protections are now enabled db_1 | LOG: database system is ready to accept connections web_1 | web_1 | 0 static files copied to '/code/static', 126 unmodified. web_1 | [2017-03-01 21:50:00 +0000] [7] [INFO] Starting gunicorn 19.6.0 web_1 | [2017-03-01 21:50:00 +0000] [7] [INFO] Listening at: http://0.0.0.0:8000 (7) web_1 | [2017-03-01 21:50:00 +0000] [7] [INFO] Using worker: sync
Emergency_response repo on Windows: fails
Emergency-response-backend under Docker Toolbox for Windows on Windows 10:
... ---> d1dece959fab Removing intermediate container 446d7dae0532 Step 14/14 : COPY . /code/ ---> d12ccbed9557 Removing intermediate container 27809cb3988a Successfully built d12ccbed9557 WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating emergencyresponsebackend_web_1 Attaching to emergencyresponsebackend_web_1 web_1 | standard_init_linux.go:178: exec user process caused "no such file or directory" emergencyresponsebackend_web_1 exited with code 1
Emergency_response repo on Mac: succeeds/fails (but for an application-specific reason)
Emergency-response-backend under Docker Toolbox for Mac on OS X 10.11:
Step 14/14 : COPY . /code/ ---> bc4a1bd8e372 Removing intermediate container e9b079ea31da Successfully built bc4a1bd8e372 WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating emergencyresponsebackend_web_1 Attaching to emergencyresponsebackend_web_1 web_1 | Traceback (most recent call last): web_1 | File "manage.py", line 10, in <module> web_1 | execute_from_command_line(sys.argv) web_1 | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line web_1 | utility.execute() web_1 | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 316, in execute web_1 | settings.INSTALLED_APPS web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 53, in __getattr__ web_1 | self._setup(name) web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 41, in _setup web_1 | self._wrapped = Settings(settings_module) web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 97, in __init__ web_1 | mod = importlib.import_module(self.SETTINGS_MODULE) web_1 | File "/usr/local/lib/python3.4/importlib/__init__.py", line 109, in import_module web_1 | return _bootstrap._gcd_import(name[level:], package, level) web_1 | File "<frozen importlib._bootstrap>", line 2254, in _gcd_import web_1 | File "<frozen importlib._bootstrap>", line 2237, in _find_and_load web_1 | File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked web_1 | File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked web_1 | File "<frozen importlib._bootstrap>", line 1129, in _exec web_1 | File "<frozen importlib._bootstrap>", line 1471, in exec_module web_1 | File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed web_1 | File "/code/emergency_response_api/settings.py", line 16, in <module> web_1 | from . import project_config web_1 | ImportError: cannot import name 'project_config' web_1 | Traceback (most recent call last): web_1 | File "manage.py", line 10, in <module> web_1 | execute_from_command_line(sys.argv) web_1 | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line web_1 | utility.execute() web_1 | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 316, in execute web_1 | settings.INSTALLED_APPS web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 53, in __getattr__ web_1 | self._setup(name) web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 41, in _setup web_1 | self._wrapped = Settings(settings_module) web_1 | File "/usr/local/lib/python3.4/site-packages/django/conf/__init__.py", line 97, in __init__ web_1 | mod = importlib.import_module(self.SETTINGS_MODULE) web_1 | File "/usr/local/lib/python3.4/importlib/__init__.py", line 109, in import_module web_1 | return _bootstrap._gcd_import(name[level:], package, level) web_1 | File "<frozen importlib._bootstrap>", line 2254, in _gcd_import web_1 | File "<frozen importlib._bootstrap>", line 2237, in _find_and_load web_1 | File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked web_1 | File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked web_1 | File "<frozen importlib._bootstrap>", line 1129, in _exec web_1 | File "<frozen importlib._bootstrap>", line 1471, in exec_module web_1 | File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed web_1 | File "/code/emergency_response_api/settings.py", line 16, in <module> web_1 | from . import project_config web_1 | ImportError: cannot import name 'project_config' ...
(Note: the runtime error in “manage.py” indicates that the command in docker-compose.yml was executed correctly, and there’s an app-specific issue in running one of the commands inside the docker-entrypoint.sh script that docker-compose.yml specifies.)
Potentially related issues re: Docker running on Windows
Absolute paths change with git bash on Windows
Docker Build Image fails with ‘NOT FOUND’ executing…
Bash script always prints command not found (perhaps a missing ‘execute’ bit, that only affects commands running in a Docker container when running on Docker Toolbox for Windows?)