Install Microsoft Office In Windows Container

Jung-Hyun Nam
Mar 31, 2020 · 6 min read
Image for post
Image for post
Container Office in Hong Kong: https://commons.wikimedia.org/wiki/File:Container_office.jpg

Caution 1: This article was written just for fun. Microsoft never guarantees the Office works best in the Windows container environment. Also, Microsoft can break the feature described in this article without any notice at any time. So, please don’t rely on this article.

Caution 2: You cannot run the Microsoft Office container for any kind of internet and intranet services due to license restrictions of the software. Please refer to the license description at Microsoft. Either this container works or not, please test this feature just for fun.

A Story About Office Automation

Microsoft Office is famous for its fluent and unique interfaces. Not only that, but Office also shines when users can adopt automation features. However, these automation features are not suitable for traditional server scenarios. Both performance and license aspects.

As an alternative, Microsoft releases OOXML format SDK to the public, and lots of third parties and open source projects adopted OOXML and publishes its SDKs. No matter what, Microsoft Office always wins because they develop their features. So if you want to stick with the latest highlights of Office, you will have to install the Microsoft Office inevitably.

A quick question comes up here; If the Microsoft Office can run in a Windows container, is it neat, right? But we don’t know does the Windows container supports Microsoft Office. Also, the installation will not easy in an automated way.

Digging Up

Also, the recent version of Microsoft Office can be customized and automated with the Office Deployment Toolkit (a.k.a. ODT). You can write your own ODT configuration file with XML syntax, and this will work fine on the container.

In this article, I tested with the Windows Server version 1903 container.

Writing ODT File

<Configuration>
<Add OfficeClientEdition="32" Channel="PerpetualVL2019">
<Product ID="ProPlus2019Volume">
<Language ID="ko-kr" />
</Product>
</Add>
<Display Level="None" AcceptEULA="TRUE" />
<Property Name="AUTOACTIVATE" Value="1"/>
</Configuration>

There is no unusual thing, but the point is, I used the 32-bit version of Office 2019 as a perpetually licensed version, not Office 365.

Writing Dockerfile

FROM mcr.microsoft.com/windows:1903 AS buildWORKDIR C:\\odtsetup
ADD https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11617-33601.exe odtsetup.exe
RUN odtsetup.exe /quiet /norestart /extract:C:\\odtsetup
FROM mcr.microsoft.com/windows:1903 AS downloadWORKDIR C:\\odtsetup
COPY --from=build C:\\odtsetup\\setup.exe .
ADD config.xml .
RUN setup.exe /download C:\\odtsetup\\config.xml
FROM mcr.microsoft.com/windows:1903
MAINTAINER rkttu
WORKDIR C:\\odtsetup
COPY --from=build C:\\odtsetup\\setup.exe .
COPY --from=download C:\\odtsetup\\Office .
ADD config.xml .
RUN setup.exe /configure C:\\odtsetup\\config.xml
WORKDIR /
RUN rmdir /s /q C:\\odtsetup
# https://stackoverflow.com/questions/10837437/interop-word-documents-open-is-null
RUN powershell -Command new-object -comobject word.application
RUN mkdir C:\\Windows\\SysWOW64\\config\\systemprofile\\Desktop
VOLUME C:\\data

I tried many times to implement this Dockerfile. When I tried to install the Office 365 x64, the installer goes weird or simply fails and return non-zero code, which leads to building image fail.

The last two lines are required to run the Microsoft Office application correctly in the container. I will explain it.

  • I cannot see what’s going on because there is no user interface, but the Word.Application COM object should initiate at least one time for continuing the rest steps.
  • If the Desktop directory does not exist in the user profile directory, the COM object returns null reference when the open file method called. I added a related link to the Stackoverflow web site.

Please remember, as I said at the first paragraph, Microsoft can update the Office, and this may lead to breaking change, which affects this article.

Let’s build the Office container with a command. Be sure to check the Docker Desktop for Windows is running.

docker build -t o365full:latest .

Writing an app that converts DOCX document into PDF file

// Requires office.dll and word interop pia.dll from GACusing Microsoft.Office.Interop.Word;
using System;
using System.IO;
using System.Linq;namespace OfficePIATest
{
internal static class Program
{
[STAThread]
public static void Main(string[] args)
{
var input = args.ElementAtOrDefault(0) ?? string.Empty;
var output = args.ElementAtOrDefault(1) ?? string.Empty;if (!File.Exists(input))
{
Console.Error.WriteLine("Cannot open the file `{0}`.", input);
Environment.Exit(1);
return;
}if (string.IsNullOrWhiteSpace(output))
{
Console.Error.WriteLine("Invalid output path.");
Environment.Exit(2);
return;
}var outputDir = Path.GetDirectoryName(output);
if (!Directory.Exists(outputDir))
Directory.CreateDirectory(outputDir);var wordApp = new Application();
Console.Out.WriteLine("word app initialized.");Document wordDocument = null;
var t = new System.Threading.Tasks.Task(() => wordDocument = wordApp.Documents.Open(input));
t.Start();
t.Wait();if (wordDocument == null)
{
Console.Error.WriteLine("Word document is null reference.");
Environment.Exit(3);
return;
}
else
Console.Out.WriteLine("Word document opened.");wordDocument.ExportAsFixedFormat(output, WdExportFormat.wdExportFormatPDF);
Console.Out.WriteLine("Export performed.");wordDocument.Close(WdSaveOptions.wdDoNotSaveChanges,
WdOriginalFormat.wdOriginalDocumentFormat,
false); //Close document
Console.Write("Closing document");wordApp.Quit(); //Important: When you forget this Word keeps running in the background
Console.Out.WriteLine("Quitting word app.");
}
}
}

To build this code, you need Office PIA DLLs. When you install the Office, PIA will automatically place it into the %windir%\Assembly\GAC_MSIL directory. Plus, you need the Office assembly and Microsoft.Office.Word library, respectively.

Also, there is an important point when you build this code. You should compile this application as x86 application — or — set the 32-bit preferred application. We installed the 32-bit Microsoft Office into a container, so we should respect this configuration.

Build your executable file and add it with a sample document file into a container. Add the below line at the end of the Dockerfile, and add the Sample directory and place your sample documents for testing.

Let’s assume that the executable file name is ‘OfficePIATest.exe,’ and the sample document placed in the directory ‘Sample’ has a name ‘demo.docx.’

ADD sample .

Then let’s build the docker image.

docker build -t o365full:latest .

Please refer to this GIST code for reference.

Testing

docker run -v %cd%\data:c:\data --rm -it --name=o365fulltest o365full:latest cmd

In the container environment, let’s run this command.

OfficePIATest.exe C:\demo.docx C:\data\test.pdf

Then the PDF file created like below!

Image for post
Image for post
Voila! Microsoft Word in the container converting the sample document into a PDF file.

Conclusion

I said earlier, despite, Office is not a server application, and you cannot use the Office like this way, so you cannot, and you should not use this Windows container.

But Windows container quite more evolved, so there are more applications can be transformed into the Windows container. I want to share this fun factor with you with a small portion of the article.

If you have any feedback or suggestion, please write down as a response. 😀

Image for post
Image for post

Dev Genius

Coding, Tutorials, News, UX, UI and much more related to development

Sign up for Best Stories

By Dev Genius

The best stories sent monthly to your email. Take a look

By signing up, you will create a Medium account if you don’t already have one. Review our Privacy Policy for more information about our privacy practices.

Check your inbox
Medium sent you an email at to complete your subscription.

Jung-Hyun Nam

Written by

Works at DEVSISTERS, Corp., Microsoft MVP since 2009, Living in S.Korea.

Dev Genius

Coding, Tutorials, News, UX, UI and much more related to development

Jung-Hyun Nam

Written by

Works at DEVSISTERS, Corp., Microsoft MVP since 2009, Living in S.Korea.

Dev Genius

Coding, Tutorials, News, UX, UI and much more related to development

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store