[Container-tools] hacking on atomicapp-run

Aaron Weitekamp aweiteka at redhat.com
Wed May 6 15:27:47 UTC 2015


Vasek and I worked out a few issues:
1. There's a docker(?) bug where if you pass in a bindmount defined by empty environment variable docker fails to find the image you're trying to run. I'll track this down.
2. We want to limit the amount of config the user needs to make so we'll change the bindmounts to $PWD (current dir). In other words, local answerfile.conf needs to be in `pwd` and "atomicapp install" will write a dir to `pwd`. At this point #1 ^^ will not matter.
3. The atomicapp-run plugin code is not working properly. Vasek is working on removing the dependency on "yapsy".
4. Currently the provider plugins depend on host CLI clients to be installed/config'd. This means we need to bindmount those into the container[1]. This is a bit messy and means to support multiple providers we would have to bindmount even more things in. I think ideally we build the API client tools for each supported provider into the container. Then the user just needs to pass in config for these providers. At that point one could launch remote atomic apps like openshift, kubernetes, etc from any platform OS as long as the providre config was provided.

Huge thanks to Vasek for hacking through this uncharted territory!


[1] kubectl "docker run" requirements (atomic run label):
    -v /usr/bin/kubectl:/usr/bin/kubectl \
    -v /etc/kubernetes:/etc/kubernetes \
    --net=host 
It's unclear to me why --net=host is needed but kubectl fails without it. Without --net=host it tries to connect to localhost:
# kubectl get minions
F0506 11:25:45.580381      13 get.go:151] Get http://localhost:8080/api/v1beta1/minions?namespace=default: dial tcp 127.0.0.1:8080: connection refused


----- Original Message -----
> Hello Aaron,
> 
> comments in-line
> 
> On 6.5.2015 06:07, Aaron Weitekamp wrote:
> > Vasek, Langdon and I hit a few issues trying out atomicapp-run[1]
> > - needed empty dict in answers.conf: "general: {}" (maybe it just doesn't
> > handle null value?)
> > - provider was kubernetes even when answerfile was "docker" and default[2]
> > was hacked with hard-coded "docker". Output[3]
> > - I got further with a custom kubernetes application but it failed on
> > install[4]. I was able to install when entering the container[5] but hit
> > this run error[6]
> >
> > [1] https://github.com/vpavlin/atomicapp-run
> >
> > [2]
> > https://github.com/vpavlin/atomicapp-run/blob/master/containerapp/constants.py#L13
> >
> > [3]
> > $ cat /etc/wp-app/answers.conf
> > general: {}
> > provider: docker
> provider should be a sub-key under general..
> > $ sudo atomic install vpavlin/wp-app
> > docker run --rm -it --privileged -v /run:/run -v ${DATADIR}:/atomicapp -v
> > /:/host -v ${CONFDIR}/answers.conf:/application-entity/answers.conf -e
> > IMAGE=vpavlin/wp-app -e NAME=wp-app --name wp-app vpavlin/wp-app
> > containerapp -v install --path /atomicapp /application-entity
> > 2015-05-05 15:46:10,633 - containerapp.install - INFO - App path is
> > /application-entity, will be populated to /atomicapp
> > 2015-05-05 15:46:10,693 - containerapp.params - DEBUG - Setting app id to
> > wordpress-app
> > 2015-05-05 15:46:10,694 - containerapp.utils - DEBUG - Setting path to
> > /application-entity
> > 2015-05-05 15:46:10,694 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > 2015-05-05 15:46:10,696 - containerapp.install - INFO - Copying content of
> > directory /application-entity to /atomicapp
> > 2015-05-05 15:46:10,696 - containerapp.install - INFO - Copying app wp-app
> > 2015-05-05 15:46:10,731 - containerapp.utils - DEBUG - No artifacts for
> > mariadb-app
> > 2015-05-05 15:46:10,731 - containerapp.utils - DEBUG - Provider: docker
> > 2015-05-05 15:46:10,731 - containerapp.utils - DEBUG - Artifact
> > file://graph/docker/label_run: OK
> > 2015-05-05 15:46:10,732 - containerapp.utils - DEBUG - Provider: openshift
> > 2015-05-05 15:46:10,732 - containerapp.utils - DEBUG - Artifact
> > file://graph/kubernetes/wordpress-pod.json: OK
> > 2015-05-05 15:46:10,733 - containerapp.utils - DEBUG - Artifact
> > file://graph/kubernetes/wordpress-service.json: OK
> > 2015-05-05 15:46:10,733 - containerapp.utils - INFO - Artifacts for
> > wordpress-app present for these providers: docker, openshift
> > 2015-05-05 15:46:10,734 - containerapp.install - INFO - Component data
> > exist in /atomicapp/graph/wp-app, skipping population...
> > 2015-05-05 15:46:10,734 - containerapp.utils - DEBUG - {u'source':
> > u'docker://vpavlin/mariadb-app'}
> > 2015-05-05 15:46:10,734 - containerapp.install - INFO - Component
> > mariadb-app is external dependency
> > 2015-05-05 15:46:10,735 - containerapp.install - DEBUG - Component path:
> > /atomicapp/external/mariadb-app
> > 2015-05-05 15:46:10,735 - containerapp.install - INFO - Pulling
> > vpavlin/mariadb-app
> > 2015-05-05 15:46:10,735 - containerapp.install - INFO - App name is
> > vpavlin/mariadb-app, will be populated to /atomicapp/external/mariadb-app
> > 2015-05-05 15:46:10,736 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > Trying to pull repository registry.access.redhat.com/vpavlin/mariadb-app
> > ... not found
> > Trying to pull repository docker.io/vpavlin/mariadb-app ...
> > d91c51dd843b: Download complete
> > 48ecf305d2cf: Download complete
> > 93be8052dfb8: Download complete
> > d364b63640ba: Download complete
> > 191c9f2e2f36: Download complete
> > d2651828afb8: Download complete
> > 2899b24724a5: Download complete
> > 50f29c5875bf: Download complete
> > 86943f2fd311: Download complete
> > f576de234d78: Download complete
> > 0d01d6974ff9: Download complete
> > c48b7d2e2a46: Download complete
> > 4d573f10028e: Download complete
> > ba19aaf75e96: Download complete
> > 05c735695902: Download complete
> > 73a89e479333: Download complete
> > 5166ceec1dcf: Download complete
> > Status: Image is up to date for docker.io/vpavlin/mariadb-app:latest
> > 9abea96c54bd39c4e8cf33392a8b6b42e442c58e10c98e8691bbd9a92b921047
> > 2015-05-05 15:46:18,581 - containerapp.utils - INFO - Using temporary
> > directory /tmp/appent-mariadb-app3Vz3AS
> > 2015-05-05 15:46:18,582 - containerapp.install - DEBUG - ['docker', 'cp',
> > u'mariadb-app:/application-entity', u'/tmp/appent-mariadb-app3Vz3AS']
> > 2015-05-05 15:46:19,149 - containerapp.install - DEBUG - Application entity
> > data copied to /tmp/appent-mariadb-app3Vz3AS
> > mariadb-app
> > 2015-05-05 15:46:19,285 - containerapp.install - DEBUG - nulecule path for
> > pulled image: /tmp/appent-mariadb-app3Vz3AS/application-entity/nulecule
> > 2015-05-05 15:46:19,299 - containerapp.params - DEBUG - Setting app id to
> > mariadb-app
> > 2015-05-05 15:46:19,299 - containerapp.install - DEBUG - App ID:
> > mariadb-app
> > 2015-05-05 15:46:19,299 - containerapp.install - INFO - Copying app
> > mariadb-app
> > 2015-05-05 15:46:19,303 - containerapp.utils - DEBUG - Provider: docker
> > 2015-05-05 15:46:19,303 - containerapp.utils - DEBUG - Artifact
> > file://graph/docker/label_run: OK
> > 2015-05-05 15:46:19,303 - containerapp.utils - DEBUG - Provider: openshift
> > 2015-05-05 15:46:19,303 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/mariadb-pod.json: OK
> > 2015-05-05 15:46:19,303 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/mariadb-service.json: OK
> > 2015-05-05 15:46:19,303 - containerapp.utils - INFO - Artifacts for
> > mariadb-app present for these providers: docker, openshift
> > 2015-05-05 15:46:19,304 - containerapp.install - INFO - Component installed
> > into /atomicapp/external/mariadb-app
> > 2015-05-05 15:46:19,304 - containerapp.utils - DEBUG - {u'artifacts':
> > {u'docker': [u'file://graph/docker/label_run'], u'openshift':
> > [u'file://graph/kubernetes/wordpress-pod.json',
> > u'file://graph/kubernetes/wordpress-service.json']}, u'params': {u'image':
> > {u'default': u'vpavlin/wordpress', u'description': u'The image which
> > containing the Wordpress itself'}, u'name': {u'default': u'wordpress',
> > u'description': u"Name given to a container when it's run"}}}
> > 2015-05-05 15:46:19,304 - containerapp.install - DEBUG - Component
> > wordpress-app is part of the app
> > [cloud-user at aweiteka-atomic-cluster-82e95893-f91a-4dd7-b026-c67666d08bb4
> > ~]$ sudo atomic run vpavlin/wp-app
> > docker run -it --privileged -v ${DATADIR}:/atomicapp -v /run:/run -v
> > /:/host -v ${CONFDIR}/answers.conf:/application-entity/answers.conf --name
> > wp-app -e NAME=wp-app -e IMAGE=vpavlin/wp-app vpavlin/wp-app containerapp
> > -v run /atomicapp
> > 2015-05-05 15:46:52,472 - containerapp.run - DEBUG - Path to code
> > /usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp
> > 2015-05-05 15:46:52,506 - containerapp.params - DEBUG - Setting app id to
> > wordpress-app
> > 2015-05-05 15:46:52,506 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > 2015-05-05 15:46:52,508 - containerapp.utils - DEBUG - No artifacts for
> > mariadb-app
> > 2015-05-05 15:46:52,508 - containerapp.utils - DEBUG - Provider: docker
> > 2015-05-05 15:46:52,508 - containerapp.utils - DEBUG - Artifact
> > file://graph/docker/label_run: OK
> > 2015-05-05 15:46:52,509 - containerapp.utils - DEBUG - Provider: openshift
> > 2015-05-05 15:46:52,509 - containerapp.utils - DEBUG - Artifact
> > file://graph/kubernetes/wordpress-pod.json: OK
> > 2015-05-05 15:46:52,509 - containerapp.utils - DEBUG - Artifact
> > file://graph/kubernetes/wordpress-service.json: OK
> > 2015-05-05 15:46:52,509 - containerapp.utils - INFO - Artifacts for
> > wordpress-app present for these providers: docker, openshift
> > 2015-05-05 15:46:52,509 - containerapp.utils - DEBUG - {u'source':
> > u'docker://vpavlin/mariadb-app'}
> > 2015-05-05 15:46:52,510 - containerapp.run - DEBUG - Path to code
> > /usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp
> > 2015-05-05 15:46:52,524 - containerapp.params - DEBUG - Setting app id to
> > mariadb-app
> > 2015-05-05 15:46:52,524 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > 2015-05-05 15:46:52,525 - containerapp.utils - DEBUG - Provider: docker
> > 2015-05-05 15:46:52,526 - containerapp.utils - DEBUG - Artifact
> > file://graph/docker/label_run: OK
> > 2015-05-05 15:46:52,526 - containerapp.utils - DEBUG - Provider: openshift
> > 2015-05-05 15:46:52,526 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/mariadb-pod.json: OK
> > 2015-05-05 15:46:52,526 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/mariadb-service.json: OK
> > 2015-05-05 15:46:52,526 - containerapp.utils - INFO - Artifacts for
> > mariadb-app present for these providers: docker, openshift
> > 2015-05-05 15:46:52,526 - containerapp.utils - DEBUG - {u'artifacts':
> > {u'docker': [u'file://graph/docker/label_run'], u'openshift':
> > [u'file://graph/k8s/mariadb-pod.json',
> > u'file://graph/k8s/mariadb-service.json']}, u'params': {u'image':
> > {u'default': u'vpavlin/mariadb', u'description': u'The image which
> > containing the Wordpress itself'}, u'name': {u'default': u'mariadb',
> > u'description': u"Name given to a container when it's run"}}}
> > 2015-05-05 15:46:52,526 - containerapp.run - DEBUG - Processing component
> > mariadb-app
> > Traceback (most recent call last):
> >    File "/usr/bin/containerapp", line 9, in <module>
> >      load_entry_point('containerapp==0.1', 'console_scripts',
> >      'containerapp')()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 100, in main
> >      cli.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 82, in run
> >      args.func(args)
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 32, in cli_run
> >      ae.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 150, in run
> >      self._dispatchGraph()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 73, in _dispatchGraph
> >      ret = component_run.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 150, in run
> >      self._dispatchGraph()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 77, in _dispatchGraph
> >      self._processComponent(component, graph_item)
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 115, in _processComponent
> >      raise Exception("Data for provider \"%s\" are not part of this app" %
> >      self.params.provider)
> > Exception: Data for provider "kubernetes" are not part of this app
> The above statement should fix this..
> >
> >
> > [4] Install from outside container
> > $ sudo atomic install helloapache
> > docker run --rm -it --privileged -v /run:/run -v ${DATADIR}:/atomicapp -v
> > /:/host -v ${CONFDIR}/answers.conf:/application-entity/answers.conf -e
> > IMAGE=helloapache -e NAME=helloapache --name helloapache helloapache
> > containerapp -v install --path /atomicapp /application-entity
> > 2015-05-05 23:48:01,105 - containerapp.install - INFO - App path is
> > /application-entity, will be populated to /atomicapp
> > 2015-05-05 23:48:01,189 - containerapp.params - DEBUG - Setting app id to
> > helloapache-app
> > 2015-05-05 23:48:01,189 - containerapp.utils - DEBUG - Setting path to
> > /application-entity
> > 2015-05-05 23:48:01,189 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > Traceback (most recent call last):
> >    File "/usr/bin/containerapp", line 9, in <module>
> >      load_entry_point('containerapp==0.1', 'console_scripts',
> >      'containerapp')()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 100, in main
> >      cli.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 82, in run
> >      args.func(args)
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 18, in cli_install
> >      install.install()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/install.py",
> >    line 75, in install
> >      if not self.params.loadAnswers(self.answers_file):
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/params.py",
> >    line 103, in loadAnswers
> >      data = anymarkup.parse_file(data)
> >    File "build/bdist.linux-x86_64/egg/anymarkup/__init__.py", line 103, in
> >    parse_file
> > anymarkup.AnyMarkupError: AnyMarkupError: caught <type
> > 'exceptions.IOError'>: [Errno 21] Is a directory:
> > '/application-entity/answers.conf'
> This is a problem of mount points: -v
> ${CONFDIR}/answers.conf:/application-entity/answers.conf
> if ${CONFDIR}/answers.conf does not exist, docker will create a
> directory...not sure how to fix this generally
> >
> >
> >
> >
> > [5] install from inside container
> >
> > bash-4.3# containerapp -v install --path /atomicapp /application-entity
> > 2015-05-06 00:06:45,476 - containerapp.install - INFO - App path is
> > /application-entity, will be populated to /atomicapp
> > 2015-05-06 00:06:45,487 - containerapp.params - DEBUG - Setting app id to
> > helloapache-app
> > 2015-05-06 00:06:45,487 - containerapp.utils - DEBUG - Setting path to
> > /application-entity
> > 2015-05-06 00:06:45,487 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > 2015-05-06 00:06:45,489 - containerapp.install - INFO - Copying content of
> > directory /application-entity to /atomicapp
> > 2015-05-06 00:06:45,489 - containerapp.install - INFO - Copying app
> > helloapache
> > 2015-05-06 00:06:45,490 - containerapp.utils - DEBUG - Provider: kubernetes
> > 2015-05-06 00:06:45,490 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/hello-apache-pod.json: OK
> > 2015-05-06 00:06:45,490 - containerapp.utils - INFO - Artifacts for
> > helloapache-app present for these providers: kubernetes
> > 2015-05-06 00:06:45,490 - containerapp.install - INFO - Component data
> > exist in /atomicapp/graph/helloapache, skipping population...
> > 2015-05-06 00:06:45,490 - containerapp.utils - DEBUG - {u'artifacts':
> > {u'kubernetes': [u'file://graph/k8s/hello-apache-pod.json']}, u'params':
> > {u'image': {u'default': u'fedora/apache', u'description': u'The image
> > which containing the Wordpress itself'}, u'name': {u'default':
> > u'helloapache', u'description': u"Name given to a container when it's
> > run"}}}
> > 2015-05-06 00:06:45,491 - containerapp.install - DEBUG - Component
> > helloapache-app is part of the app
> >
> >
> >
> > [6] Run from inside container
> > bash-4.3# containerapp -v run /atomicapp --ask
> > 2015-05-05 23:58:37,435 - containerapp.run - DEBUG - Path to code
> > /usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp
> > 2015-05-05 23:58:37,446 - containerapp.params - DEBUG - Setting app id to
> > helloapache-app
> > 2015-05-05 23:58:37,446 - containerapp.params - DEBUG - Path to answers
> > file given, loading /application-entity/answers.conf
> > 2015-05-05 23:58:37,448 - containerapp.utils - DEBUG - Provider: kubernetes
> > 2015-05-05 23:58:37,448 - containerapp.utils - DEBUG - Artifact
> > file://graph/k8s/hello-apache-pod.json: OK
> > 2015-05-05 23:58:37,448 - containerapp.utils - INFO - Artifacts for
> > helloapache-app present for these providers: kubernetes
> > 2015-05-05 23:58:37,448 - containerapp.utils - DEBUG - {u'artifacts':
> > {u'kubernetes': [u'file://graph/k8s/hello-apache-pod.json']}, u'params':
> > {u'image': {u'default': u'fedora/apache', u'description': u'The image
> > which containing the web server'}, u'name': {u'default': u'helloapache',
> > u'description': u"Name given to a container when it's run"}}}
> > 2015-05-05 23:58:37,448 - containerapp.run - DEBUG - Processing component
> > helloapache-app
> > 2015-05-05 23:58:37,453 - containerapp.utils - INFO - Using temporary
> > directory /tmp/appent-helloapache-appYWEhDQ
> > 2015-05-05 23:58:37,453 - containerapp.run - DEBUG - Templating artifact
> > /atomicapp/graph/k8s/hello-apache-pod.json
> > 2015-05-05 23:58:37,453 - containerapp.params - DEBUG - Ask for image: The
> > image which containing the web server
> > image (The image which containing the web server, default: fedora/apache):
> > 2015-05-05 23:58:39,127 - containerapp.params - DEBUG - Ask for name: Name
> > given to a container when it's run
> > name (Name given to a container when it's run, default: helloapache):
> > 2015-05-05 23:58:40,227 - containerapp.run - DEBUG - Config: {u'image':
> > u'fedora/apache', u'name': u'helloapache'}
> > 2015-05-05 23:58:40,228 - containerapp.run - DEBUG - {u'image':
> > u'fedora/apache', u'name': u'helloapache'}
> > 2015-05-05 23:58:40,278 - containerapp.run - DEBUG - Writing artifact to
> > /tmp/appent-helloapache-appYWEhDQ/helloapache-app/graph/k8s/hello-apache-pod.json
> > 2015-05-05 23:58:40,279 - containerapp.run - INFO - Using provider
> > kubernetes for component helloapache-app
> > Traceback (most recent call last):
> >    File "/usr/bin/containerapp", line 9, in <module>
> >      load_entry_point('containerapp==0.1', 'console_scripts',
> >      'containerapp')()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 100, in main
> >      cli.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 82, in run
> >      args.func(args)
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/cli/main.py",
> >    line 32, in cli_run
> >      ae.run()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 150, in run
> >      self._dispatchGraph()
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 77, in _dispatchGraph
> >      self._processComponent(component, graph_item)
> >    File
> >    "/usr/lib/python2.7/site-packages/containerapp-0.1-py2.7.egg/containerapp/run.py",
> >    line 138, in _processComponent
> >      provider.init(self.params.getValues(component),
> >      artifact_provider_list, dst_dir, self.dryrun, logger)
> > AttributeError: 'NoneType' object has no attribute 'init'
> Not sure about this one..I encountered it while playing with centos as a
> base image, but it worked on Fedora base...I was not able to fix it yet..
> 
> Vašek
> 
> --
> 
> Lead Infrastructure Engineer
> Developer Experience
> Brno, Czech Republic
> Phone: +420 739 666 824
> 
> 




More information about the Container-tools mailing list