Windows servercoreのコンテナイメージにPythonをインストールする

# はじめに

GCPのCompute Engineインスタンス上にあるWindows servercoreのDockerイメージの中にPythonをインストールした時のメモ。

なお、作業の上でこちらを参考にしました。
https://medium.com/rkttu/creating-python-docker-image-for-windows-nano-server-151e1ab7188a

インスタンスへのログイン方法は様々な記事で記載されているので割愛します。

# 環境

- GCP Compute Engine
- Microsoft, Windows Server, 2019 Datacenter for Containers, x64 built on 20200310

# 作業内容

## 環境の確認

インスタンスへログインしたあと、IEでPythonをダウンロードするので、セキュリティ設定を一時的に変更しておきます。

![security.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/5e53c1ff-7674-ef36-c03a-882e11e84d06.png)

PowerShellを管理者権限で起動して、dockerがインストールされているか確認します。

```powershell

PS C:\Windows\system32> docker -v
Docker version 18.09.11, build 6112046bc9
```

## OS上へPythonをインストール

https://www.python.org/downloads/windows/
ここから好きなインストーラーをダウンロードします。
ここでは「Python 3.7.7 - March 10, 2020」の「Windows x86-64 executable installer」を使用しています。
デフォルトのままインストールを完了すると、以下のようなディレクトリに実行ファイルなどが格納されています。

```powershell
PS C:\Windows\system32> ls C:\Users\<ユーザ名>\AppData\Local\Programs\Python\Python37\


    Directory: C:\Users\<ユーザ名>\AppData\Local\Programs\Python\Python37


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        4/14/2020  10:29 AM                DLLs
d-----        4/14/2020  10:29 AM                Doc
d-----        4/14/2020  10:29 AM                include
d-----        4/14/2020  10:29 AM                Lib
d-----        4/14/2020  10:29 AM                libs
d-----        4/14/2020  10:29 AM                Scripts
d-----        4/14/2020  10:29 AM                tcl
d-----        4/14/2020  10:29 AM                Tools
-a----        3/10/2020  10:44 AM          30194 LICENSE.txt
-a----        3/10/2020  10:44 AM         731115 NEWS.txt
-a----        3/10/2020  10:42 AM         100368 python.exe
-a----        3/10/2020  10:42 AM          58896 python3.dll
-a----        3/10/2020  10:41 AM        3751440 python37.dll
-a----        3/10/2020  10:42 AM          98832 pythonw.exe
-a----        3/10/2020   9:39 AM          89752 vcruntime140.dll


PS C:\Windows\system32>
```

## Dockerコンテナイメージへファイルをコピー

最初に使用するコンテナイメージを立ち上げておきます。

```powershell
PS C:\Windows\system32> docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
mcr.microsoft.com/windows/servercore   ltsc2019            80e84fd280e2        6 weeks ago         4.94GB
PS C:\Windows\system32> docker run -itd mcr.microsoft.com/windows/servercore:ltsc2019
c8e309e31f4bcd62dd0fa80196772a8dc90564fcd5da13c829c0cf68f826bd68
PS C:\Windows\system32> docker ps
CONTAINER ID        IMAGE                                           COMMAND                    CREATED             STATUS              PORTS               NAMES
c8e309e31f4b        mcr.microsoft.com/windows/servercore:ltsc2019   "c:\\windows\\system32…"   11 seconds ago      Up 4 seconds                            elated_khayyam
PS C:\Windows\system32>
```

dockerイメージにファイルをコピーします。

```powershell
PS C:\Windows\system32> docker cp C:\Users\<ユーザ名>\AppData\Local\Programs\Python\. c8e309e31f4b:"C:\Program Files"
```

dockerイメージに入って、パスを通し、動作確認します。

```powershell
PS C:\Windows\system32> docker attach c8e309e31f4b

Microsoft Windows [Version 10.0.17763.1098]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\>dir C:\"Program Files"\Python37\
 Volume in drive C has no label.
 Volume Serial Number is 7A0B-8FBB

 Directory of C:\Program Files\Python37

04/14/2020  10:29 AM    <DIR>          .
04/14/2020  10:29 AM    <DIR>          ..
04/14/2020  10:29 AM    <DIR>          DLLs
04/14/2020  10:29 AM    <DIR>          Doc
04/14/2020  10:29 AM    <DIR>          include
04/14/2020  10:29 AM    <DIR>          Lib
04/14/2020  10:29 AM    <DIR>          libs
03/10/2020  10:44 AM            30,194 LICENSE.txt
03/10/2020  10:44 AM           731,115 NEWS.txt
03/10/2020  10:42 AM           100,368 python.exe
03/10/2020  10:42 AM            58,896 python3.dll
03/10/2020  10:41 AM         3,751,440 python37.dll
03/10/2020  10:42 AM            98,832 pythonw.exe
04/14/2020  10:29 AM    <DIR>          Scripts
04/14/2020  10:29 AM    <DIR>          tcl
04/14/2020  10:29 AM    <DIR>          Tools
03/10/2020  09:39 AM            89,752 vcruntime140.dll
               7 File(s)      4,860,597 bytes
              10 Dir(s)  20,977,143,808 bytes free

C:\>set PATH=%PATH%;C:\"Program Files"\Python37\

C:\>python
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

C:\>
```

無事にpythonが起動することを確認できました。

## DockerFileに記載する場合

こちらは個人的なメモですが、参考にしたURLなどでも記載されているような記述をすればいけそうです（未検証）。
https://medium.com/rkttu/creating-python-docker-image-for-windows-nano-server-151e1ab7188a

## error during connectのエラーが出た場合

dockerを使おうとしたときに、下のようなエラーが出た時がありました。

```powershell
PS C:\Windows\system32> docker ps
error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.39/containers/json: open //./pipe/docker_engine: The system cannot find the file specified.
```

dockerを再起動したら、直りました。

```powershell
PS C:\Windows\system32> Restart-Service Docker
PS C:\Windows\system32> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
PS C:\Windows\system32>
```

# まとめ

Windows servercoreコンテナイメージ上にPythonをインストールしたときのメモでした。
良いへの方法をご存知でしたら是非教えてください！