MagicDraw in Docker

From BITPlan Wiki
Jump to navigation Jump to search

How to run MagicDraw in Docker container

see also https://community.nomagic.com/running-magicdraw-in-a-docker-container-t5895.html

The goal is to get an older MagicDraw 16.9 working in a container. The following approach has been tested on Mac OS 10.13.6 High Sierra and Ubuntu 18.04 LTS Bionic Beaver.

The first step is to try the Prerequisites. In this step we try out to get a Java Swing GUI to work in a Docker container. If this works our chances are high that the docker container for Magicdraw will also work.

Prerequisites

You need to be able to run a Java 6 Swing GUI in a container. To get the GUI environment working might be tricky e.g. on MacOS see

Please try out the following Dockerfile and Gui.java first using the build and run scripts.

./build
./run

The Java based gui should appear: Guitest.png

Dockerfile

FROM java:6
MAINTAINER Wolfgang Fahl (https://www.bitplan.com)

LABEL Description="Java GUI"

COPY src /home/root/java/src
WORKDIR /home/root/java

RUN mkdir bin
RUN javac -d bin src/Gui.java

WORKDIR /home/root/java/
ENTRYPOINT ["java", "-cp","bin","Gui"]

Gui.java

to be put in the src folder

import javax.swing.*;
import java.awt.event.*;

/**
 * 
 */
public class Gui {
public static class MyAction implements ActionListener {
public void actionPerformed(ActionEvent ae){
        JOptionPane.showMessageDialog(null, "Thanks.", "GUI Test", 1);
}
}
public static void main(String args[]){
        JFrame frame = new JFrame("GUI Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300,300);
        JButton button1 = new JButton("Click me");
        frame.getContentPane().add(button1);
        button1.addActionListener(new MyAction());

        frame.setVisible(true);
}
}

build

#!/bin/bash
# WF 2019-04-03
docker build . -t bitplan/javagui:latest

run

This run script tries to make the X11 environment of your host computer available to your docker container. The approach is slightly different on Linux and MacOS. This has not been tested on Windows due to the need of an X11 environment. According to https://blogs.msdn.microsoft.com/jamiedalton/2018/05/17/windows-10-docker-gui/ you might have some success with Xming in this environment. Please let me know whether this works via http://www.bitplan.com/index.php/Contact.

#!/bin/bash
# WF 2019-04-03
echo "DISPLAY=$DISPLAY"

# use socat for port 6000
port6000() {
  echo "checking port 6000"
  lsof -i TCP:6000
  if [ $? -ne 0 ]
  then
    socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"&
  fi
}

docker stop javagui
docker rm javagui
os=$(uname -a)
case $os in
  Linux*) 
   dockerdisplay=$DISPLAY
   n="--net=host"
   v="-v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/root/.Xauthority:rw";;
  Darwin*) 
   port6000
   dockerdisplay=docker.for.mac.host.internal:0
   v=""
   n="";;
esac
docker run  --name javagui -e DISPLAY=$dockerdisplay $n $v bitplan/javagui:latest
#docker exec -it javagui /bin/bash

magicdraw 16

You need a MD_UML_169_no_install.zip which you can download from the No Magic magicdraw website.

The run script includes a mount

-v $HOME/:/home/$USER

which will make your home directory available inside the docker container. This way you can select your license key file and the models you'd like to open.

Dockerfile

# see http://wiki.bitplan.com/index.php?title=MagicDraw_in_Docker
FROM java:6
MAINTAINER Wolfgang Fahl (https://www.bitplan.com)

LABEL Description="Java Magicdraw"

ADD MD_UML_169_no_install.zip /home/root/java/md/
WORKDIR /home/root/java/md
RUN unzip /home/root/java/md/MD_UML_169_no_install.zip

WORKDIR /home/root/java/md
ENTRYPOINT ["bin/mduml"]

build

#!/bin/bash
# WF 2019-04-03
docker build . -t bitplan/md16:latest

run

#!/bin/bash
# WF 2019-04-03
echo "DISPLAY=$DISPLAY"
# use socat for port 6000
port6000() {
  echo "checking port 6000"
  lsof -i TCP:6000
  if [ $? -ne 0 ]
  then
    socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"&
  fi
}
docker stop md16
docker rm md16
os=$(uname -a)
case $os in
  Linux*)
   dockerdisplay=$DISPLAY
   n="--net=host"
   v="-v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/root/.Xauthority:rw";;
  Darwin*)
   port6000
   dockerdisplay=docker.for.mac.host.internal:0
   v=""
   n="";;
esac
docker run  --name md16 -e DISPLAY=$dockerdisplay $n $v -v $HOME/:/home/$USER bitplan/md16:latest