فهرست منبع

Merge pull request #1957 from aanand/stub-run-on-windows

WIP: Build Windows binary
mnowster 10 سال پیش
والد
کامیت
aa70209ade
3فایلهای تغییر یافته به همراه47 افزوده شده و 6 حذف شده
  1. 17 5
      compose/cli/main.py
  2. 6 1
      compose/cli/utils.py
  3. 24 0
      script/build-windows.ps1

+ 17 - 5
compose/cli/main.py

@@ -8,7 +8,6 @@ import sys
 from inspect import getdoc
 from operator import attrgetter
 
-import dockerpty
 from docker.errors import APIError
 from requests.exceptions import ReadTimeout
 
@@ -31,6 +30,11 @@ from .log_printer import LogPrinter
 from .utils import get_version_info
 from .utils import yesno
 
+WINDOWS = (sys.platform == 'win32')
+
+if not WINDOWS:
+    import dockerpty
+
 log = logging.getLogger(__name__)
 console_handler = logging.StreamHandler(sys.stderr)
 
@@ -337,6 +341,14 @@ class TopLevelCommand(Command):
         """
         service = project.get_service(options['SERVICE'])
 
+        detach = options['-d']
+
+        if WINDOWS and not detach:
+            raise UserError(
+                "Interactive mode is not yet supported on Windows.\n"
+                "Please pass the -d flag when using `docker-compose run`."
+            )
+
         if options['--allow-insecure-ssl']:
             log.warn(INSECURE_SSL_WARNING)
 
@@ -351,7 +363,7 @@ class TopLevelCommand(Command):
                 )
 
         tty = True
-        if options['-d'] or options['-T'] or not sys.stdin.isatty():
+        if detach or options['-T'] or not sys.stdin.isatty():
             tty = False
 
         if options['COMMAND']:
@@ -362,8 +374,8 @@ class TopLevelCommand(Command):
         container_options = {
             'command': command,
             'tty': tty,
-            'stdin_open': not options['-d'],
-            'detach': options['-d'],
+            'stdin_open': not detach,
+            'detach': detach,
         }
 
         if options['-e']:
@@ -409,7 +421,7 @@ class TopLevelCommand(Command):
 
             raise e
 
-        if options['-d']:
+        if detach:
             service.start_container(container)
             print(container.name)
         else:

+ 6 - 1
compose/cli/utils.py

@@ -66,7 +66,12 @@ def call_silently(*args, **kwargs):
     Like subprocess.call(), but redirects stdout and stderr to /dev/null.
     """
     with open(os.devnull, 'w') as shutup:
-        return subprocess.call(*args, stdout=shutup, stderr=shutup, **kwargs)
+        try:
+            return subprocess.call(*args, stdout=shutup, stderr=shutup, **kwargs)
+        except WindowsError:
+            # On Windows, subprocess.call() can still raise exceptions. Normalize
+            # to POSIXy behaviour by returning a nonzero exit code.
+            return 1
 
 
 def is_mac():

+ 24 - 0
script/build-windows.ps1

@@ -0,0 +1,24 @@
+$ErrorActionPreference = "Stop"
+Set-PSDebug -trace 1
+
+# Remove virtualenv
+if (Test-Path venv) {
+    Remove-Item -Recurse -Force .\venv
+}
+
+# Remove .pyc files
+Get-ChildItem -Recurse -Include *.pyc | foreach ($_) { Remove-Item $_.FullName }
+
+# Create virtualenv
+virtualenv .\venv
+
+# Install dependencies
+.\venv\Scripts\easy_install "http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download"
+.\venv\Scripts\pip install -r requirements.txt
+.\venv\Scripts\pip install -r requirements-build.txt
+.\venv\Scripts\pip install .
+
+# Build binary
+.\venv\Scripts\pyinstaller .\docker-compose.spec
+Move-Item -Force .\dist\docker-compose .\dist\docker-compose-Windows-x86_64.exe
+.\dist\docker-compose-Windows-x86_64.exe --version