We provide a custom rule in cmake to allow you to build, tag, and deploy a simple Docker container:
add_container( NAME <Container Target Name> FROM <Upstream Image Name> ENTRY_POINT <Target Name> DEPENDS <Target Names...> TAG <Local Tag Name> ACCOUNT <Account ID> FILES <Files...> PORTS <Ports...> PACKAGES <Packages...> ENV <Enviornment Variables...> ARK_CONFIG_PACKAGES <Config Packages...> ARK_VENVS <Virtual environment target names...> ECR_ID <Repository ID>)
If the container target name is not supplied, the script will use the entry point target name instead.
This will create a number of steps for, with the following names:
<Container Target Name>-container- Strips binaries and builds your Docker container
<Container Target Name>-deploy-push- Everything in
container, plus the container is pushed
<Container Target Name>-docker- A shorthand for
Many of these arguments are optional. For example, if “FROM” is not populated,
the default will be
ubuntu:latest. The only required arguments are:
ECR_ID are not specified, you do not gain
-docker build targets (but you can still build a container
add_container( ENTRY_POINT api_gateway TAG api_gateway DEPENDS catalog_scheduler catalog_sim ACCOUNT 095412845506.dkr.ecr.us-east-1.amazonaws.com FILES ark/myfile/1.txt ark/myfile/2.txt PORTS 8080 PACKAGES wget curl ECR_ID api-gateway-ecr)
In the above example, this will copy
api_gateway into the root of the container,
and then copy each of the files into the root (preserving their full paths, so
api_gateway can access the files as
catalog_sim will be added into the container
and dependency tree.
The “wget” and “curl” packages will be installed, and finally, the ports you list will be ’exposed’ in the Dockerfile.
This automatically generates a Dockerfile for you, based on your above commands. It currently assumes Ubuntu (Latest), and will install certificates and a few other bits you need for HTTPS to work.
Each configuration package specified will parse the YAML file provided to retrieve all dependencies of that file; these will all be added to your docker container.
Targets versus Scripts
If your entry point is a target, that target will be built automatically, stripped, and then added to the container. If it is not a target, it will simply be added to the container.
In the case of scripts, you must have your script in the same location as the
file that has the
add_container directive within it.
Including Config Packages and VirtualEnvs
You can use the
ARK_CONFIG_PACKAGES list to pass specific config package YAML files
that you wish to have included in your container. Both the config package and all of its
dependant files will be included.
Similarly, you can use the
ARK_VENVS directive to copy in the virtual environments (using
the Ark build system target name) into your container. Note that there is some coupling between
the system Python and the virtualenv; it’s a good idea to keep your docker operating system image
and host operating system image in sync.