In an attempt to compare how long it will take to build a Docker image of Oracle XE (11.2) vs EE (12.2) on my Mac I ran into a problem. The building of XE failed, it complained that only 1023 MB swap space was available. I thought that adding swap during build with this workaround would do, but it turns out that with Docker things are different.
I found suggestions here , but since I was not reading carefully enough, I missed the point that you add swap to the hypervisor Docker for Mac is running on. This is what I did to solve it. You connect to the hypervisor with:
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
In my case it did not ask for a password, you get connected as root. Just apply the normal procedure to add swap temporarily:
dd if=/dev/zero of=/var/swap.file count=2000000 bs=1024
chmod 0600 /var/swap.file
mkswap /var/swap.file
echo "/var/swap.file swap swap defaults 0 0" >> /etc/fstab
swapon -a
Disconnect with Ctrl-A d
. Start the building again with:
./buildDockerImage.sh -v 11.2.0.2 -x
The change above is not permanent. After a restart of Docker, you can check with free -m
(when connected to the hypervisor) that available swap space is down to 1023MB.
By the way, I am using Docker for Mac, check out a comparison of Docker for Mac vs Docker Toolbox
It is worth pointing out that while Docker Toolbox used a VirtualBox VM, Docker for Mac uses Hyperkit , a lightweight macOS virtualization solution built on top of Hypervisor.framework in macOS 10.10 Yosemite and higher.
Another strange issue was that when I connected with screen
a second time, the terminal was a complete mess. After a restart of Docker, the terminal was OK.
To start the XE container I used the following command:
docker run -d -p 15210:1521 --name oracle-xe --shm-size=2g oracle/database:11.2.0.2-xe
Without the shm-size
option it will fail:
Error: The container doesn't have enough memory allocated.
A database XE container needs at least 1 GB of shared memory (/dev/shm).
You currently only have 64 MB allocated to the container.
Here I used the option -d
, in order to run it in the background. Use this command to see the progress of the database creation:
docker logs -ft oracle-xe
I also forward the standard 1521 port to 15210 since 1521 is likely occupied with something else.
Last tip: SQL Developer Command Line version is very lightweight and useful when testing this, you probably can’t get connected faster than this:
./sql system/ede49171a7c0349c@localhost:15210/XE
(For once I am not worried about sharing a password, they are generated for each new container.)