Giter Site home page Giter Site logo

indigo-dc / udocker Goto Github PK

View Code? Open in Web Editor NEW
1.2K 34.0 129.0 6.49 MB

A basic user tool to execute simple docker containers in batch or interactive systems without root privileges.

Home Page: https://indigo-dc.github.io/udocker/

License: Apache License 2.0

Python 70.96% Shell 27.34% TeX 1.70%
docker containers batch user emulation proot runc fakechroot indigo grid

udocker's Introduction

PyPI version Build Status

SQAaaS badge


logo

udocker is a basic user tool to execute simple docker containers in user space without requiring root privileges. Enables download and execution of docker containers by non-privileged users in Linux systems where docker is not available. It can be used to pull and execute docker containers in Linux batch systems and interactive clusters that are managed by other entities such as grid infrastructures or externally managed batch or interactive systems.

udocker does not require any type of privileges nor the deployment of services by system administrators. It can be downloaded and executed entirely by the end user. The limited root functionality provided by some of the udocker execution modes is either simulated or provided via user namespaces.

udocker is a wrapper around several tools and libraries to mimic a subset of the docker capabilities including pulling images and running containers with minimal functionality.

Documentation

The full documentation is available at:

How does it work

udocker is written in Python, it has a minimal set of dependencies so that can be executed in a wide range of Linux systems.

udocker does not make use of docker nor requires its presence.

udocker "executes" the containers by simply providing a chroot like environment over the extracted container. The current implementation supports different methods to mimic chroot thus enabling execution of containers under a chroot like environment without requiring privileges. udocker transparently supports several methods to execute the containers based on external tools and libraries such as:

  • PRoot
  • Fakechroot
  • runc
  • crun
  • Singularity

With the exception of Singularity the tools and libraries to support execution are downloaded and deployed by udocker during the installation process. This installation is performed in the user home directory and does not require privileges. The udocker related files such as libraries, executables, documentation, licenses, container images and extracted directory trees are placed by default under $HOME/.udocker.

Advantages

  • Can be deployed by the end-user
  • Does not require privileges for installation
  • Does not require privileges for execution
  • Does not require compilation, just transfer the Python code
  • Encapsulates several tools and execution methods
  • Includes the required tools already statically compiled to work across systems
  • Provides a docker like command line interface
  • Supports a subset of docker commands: search, pull, import, export, load, save, login, logout, create and run
  • Understands docker container metadata
  • Allows loading of docker and OCI containers
  • Supports NVIDIA GPGPU applications
  • Can execute in systems and environments where Linux namespaces support is unavailable
  • Runs both on new and older Linux distributions including: CentOS 6, CentOS 7, CentOS 8, Ubuntu 14, Ubuntu 16, Ubuntu 18, Ubuntu 20, Ubuntu 21, Alpine, Fedora, etc

Python 2 and Python 3

Since v1.3.0, udocker supports Python 2.6, 2.7 and Python >= 3.6. The original udocker v1.1.x for Python 2 is no longer maintained but is still available here.

Syntax

        Commands:
          search <repo/expression>      :Search dockerhub for container images
          pull <repo/image:tag>         :Pull container image from dockerhub
          create <repo/image:tag>       :Create container from a pulled image
          run <container>               :Execute container
          run <repo/image:tag>          :Pull, create and execute container

          images -l                     :List container images
          ps -m -s                      :List created containers
          name <container_id> <name>    :Give name to container
          rmname <name>                 :Delete name from container
          rename <name> <new_name>      :Change container name
          clone <container_id>          :Duplicate container
          rm <container-id>             :Delete container
          rmi <repo/image:tag>          :Delete image
          tag <repo/image:tag> <repo2/image2:tag2> :Tag image

          import <tar> <repo/image:tag> :Import tar file (exported by docker)
          import - <repo/image:tag>     :Import from stdin (exported by docker)
          export -o <tar> <container>   :Export container directory tree
          export - <container>          :Export container directory tree
          load -i <imagefile>           :Load image from file (saved by docker)
          load                          :Load image from stdin (saved by docker)
          save -o <imagefile> <repo/image:tag>  :Save image with layers to file

          inspect <repo/image:tag>      :Return low level information on image
          inspect -p <container>        :Return path to container location
          verify <repo/image:tag>       :Verify a pulled or loaded image
          manifest inspect <repo/image:tag> :Print manifest metadata

          protect <repo/image:tag>      :Protect repository
          unprotect <repo/image:tag>    :Unprotect repository
          protect <container>           :Protect container
          unprotect <container>         :Unprotect container

          mkrepo <top-repo-dir>         :Create another repository in location
          setup                         :Change container execution settings
          login                         :Login into docker repository
          logout                        :Logout from docker repository

          help                          :This help
          run --help                    :Command specific help
          version                       :Shows udocker version

        Options common to all commands must appear before the command:
          -D                            :Debug
          --quiet                       :Less verbosity
          --repo=<directory>            :Use repository at directory
          --insecure                    :Allow insecure non authenticated https
          --allow-root                  :Allow execution by root NOT recommended

Examples

Some examples of usage:

Search container images in dockerhub and listing tags.

udocker search  fedora
udocker search  ubuntu
udocker search  debian

udocker search --list-tags ubuntu

Pull from dockerhub and list the pulled images.

udocker pull   fedora:39
udocker pull   busybox
udocker pull   iscampos/openqcd
udocker images

Pull from a registry other than dockerhub.

udocker search  quay.io/bio
udocker search  --list-tags  quay.io/biocontainers/scikit-bio
udocker pull    quay.io/biocontainers/scikit-bio:0.2.3--np112py35_0
udocker images

Pull a different architecture such as arm64 instead of amd64.

udocker manifest inspect centos/centos8
udocker pull --platform=linux/arm64 centos/centos8
udocker tag centos/centos8  mycentos/centos8:arm64

Create a container from a pulled image, assign a name to the created container and run it. A created container can be run multiple times until it is explicitly removed. Files modified or added to the container remain available across executions until the container is removed.

udocker create --name=myfed  fedora:29
udocker run  myfed  cat /etc/redhat-release

The three steps of pulling, creating and running can be also achieved in a single command, however this will be much slower for multiple invocations of the same container, as a new container will be created for each invocation. This approach will also consume more storage space. The following example creates a new container for each invocation.

udocker run  fedora:29  cat /etc/redhat-release

Execute mounting the host /home/u457 into the container directory /home/cuser. Notice that you can "mount" any host directory inside the container. Depending on the execution mode the "mount" is implemented differently and may have restrictions.

udocker run -v /home/u457:/home/cuser -w /home/user myfed  /bin/bash
udocker run -v /var -v /proc -v /sys -v /tmp  myfed  /bin/bash

Place a script in your host /tmp and execute it in the container. Notice that the behavior of --entrypoint changed from the previous versions for better compatibility with docker.

udocker run  -v /tmp  --entrypoint="" myfed  /bin/bash -c 'cd /tmp; ./myscript.sh'

udocker run  -v /tmp  --entrypoint=/bin/bash  myfed  -c 'cd /tmp; ./myscript.sh'

Execute mounting the host /var, /proc, /sys and /tmp in the same container directories. Notice that the content of these container directories will be obfuscated by the host files.

udocker run -v /var -v /proc -v /sys -v /tmp  myfed  /bin/bash

Install software inside the container.

udocker run  --user=root myfed  yum install -y firefox pulseaudio gnash-plugin

Run as some user. The usernames should exist in the container.

udocker run --user 1000:1001  myfed  /bin/id
udocker run --user root   myfed  /bin/id
udocker run --user jorge  myfed  /bin/id

Running Firefox.

udocker run --bindhome --hostauth --hostenv \
   -v /sys -v /proc -v /var/run -v /dev --user=jorge --dri myfed  firefox

Change execution engine mode from PRoot to Fakechroot and run.

udocker setup  --execmode=F3  myfed

udocker run --bindhome --hostauth --hostenv \
   -v /sys -v /proc -v /var/run -v /dev --user=jorge --dri myfed  firefox

Change execution engine mode to accelerated PRoot.

udocker setup  --execmode=P1  myfed

Change execution engine to runc.

udocker setup  --execmode=R1  myfed

Change execution engine to Singularity. Requires the availability of Singularity in the host system.

./udocker setup  --execmode=S1  myfed

Install software running as root emulation in Singularity:

udocker setup  --execmode=S1  myfed
udocker run  --user=root myfed  yum install -y firefox pulseaudio gnash-plugin

Change execution to enable nvidia ready applications. Requires that the nvidia drivers are installed in the host system.

udocker setup  --nvidia  mytensorflow

Security

By default udocker via PRoot offers the emulation of the root user. This emulation mimics a real root user (e.g getuid will return 0). This is just an emulation no root privileges are involved. This feature makes possible the execution of some tools that do not require actual privileges but which refuse to work if the username or id are not root or 0. This enables for instance software installation using rpm, yum or dnf inside the container.

udocker does not offer robust isolation features such as the ones offered by docker. Therefore if the containers content is not trusted then these containers should not be executed with udocker as they will run inside the user environment. For this reason udocker should not be run by privileged users.

Container images and filesystems will be unpacked and stored in the user home directory under $HOME/.udocker or other location of choice. Therefore the containers data will be subjected to the same filesystem protections as other files owned by the user. If the containers have sensitive information the files and directories should be adequately protected by the user.

udocker does not require privileges and runs under the identity of the user invoking it. Users can downloaded udocker and execute it without requiring system administrators intervention.

udocker also provides execution with runc, crun and Singularity, these modes make use of rootless namespaces and enable a normal user to execute as root with the limitations that apply to user namespaces and to these tools.

When executed by normal unprivileged users, udocker limits privilege escalation issues since it does not use or require system privileges.

General Limitations

Since root privileges are not involved any operation that really requires such privileges will not be possible. The following are examples of operations that are not possible:

  • accessing host protected devices and files
  • listening on TCP/IP privileged ports (range below 1024)
  • mount file-systems
  • the su command will not work
  • change the system time
  • changing routing tables, firewall rules, or network interfaces

If the containers require such privilege capabilities then docker should be used instead.

udocker is not meant to create containers. Creation of containers is better performed using docker and dockerfiles.

udocker does not provide all the docker features, and is not intended as a docker replacement.

udocker is mainly oriented at providing a run-time environment for containers execution in user space. udocker is particularly suited to run user applications encapsulated in docker containers.

Debugging or using strace with the PRoot engine will not work as both the debuggers and PRoot use the same tracing mechanism.

Execution mode specific limitations

udocker offers multiple execution modes leveraging several external tools such as PRoot (P mode), Fakechroot (F mode), runC (R mode), crun (R mode) and Singularity (S mode).

When using execution Fakechroot modes such as F2, F3 and F4 the created containers cannot be moved across hosts. In this case convert back to a Pn mode before transfer. This is not needed if the hosts are part of an homogeneous cluster where the mount points and directory structure is the same. This limitation applies whenever the absolute realpath to the container directory changes.

The default accelerated mode of PRoot (mode P1) may exhibit problems in Linux kernels above 4.0 due to kernel changes and upstream issues, in this case use mode P2 or any of the other execution modes.

./udocker setup  --execmode=P2  my-container-id

The Fakechroot modes (Fn modes) require shared libraries compiled against the libc shipped with the container. udocker provides these libraries for several Linux distributions, these shared libraries are installed by udocker under:

$HOME/.udocker/lib/libfakechroot-*

The runc and crun modes (R modes) require a kernel with user namespaces enabled.

The singularity mode (S mode) requires the availability of Singularity in the host system. Singularity is not shipped with udocker.

Metadata generation

The codemeta.json metadata file was initially generated with codemetapy package:

codemetapy udocker --with-orcid --affiliation "LIP Lisbon" \
  --buildInstructions "https://https://github.com/indigo-dc/udocker/blob/master/docs/installation_manual.md#3-source-code-and-build" \
  --citation "https://doi.org/10.1016/j.cpc.2018.05.021" \
  --codeRepository "https://github.com/indigo-dc/udocker" \
  --contIntegration "https://jenkins.eosc-synergy.eu/job/indigo-dc/job/udocker/job/master/" --contributor "Mario David" \
  --copyrightHolder "LIP"  --copyrightYear "2016" --creator "Jorge Gomes" \
  --dateCreated "2021-05-26" --maintainer "Jorge Gomes" \
  --readme "https://github.com/indigo-dc/udocker/blob/master/README.md" \
  --referencePublication "https://doi.org/10.1016/j.cpc.2018.05.021" \
  --releaseNotes "https://github.com/indigo-dc/udocker/blob/master/changelog" \
  -O codemeta.json

Further updates may be needed to add the correct values in the metadata file.

Contributing

See: Contributing

Citing

See: Citing

When citing udocker please use the following:

  • Jorge Gomes, Emanuele Bagnaschi, Isabel Campos, Mario David, Luís Alves, João Martins, João Pina, Alvaro López-García, Pablo Orviz, Enabling rootless Linux Containers in multi-user environments: The udocker tool, Computer Physics Communications, Available online 6 June 2018, ISSN 0010-4655, https://doi.org/10.1016/j.cpc.2018.05.021

Licensing

Redistribution, commercial use and code changes must regard all licenses shipped with udocker. These include the udocker license and the individual licences of the external tools and libraries packaged for use with udocker. For further information see the software licenses section of the installation manual.

Acknowledgements

This work was performed in the framework of the H2020 project INDIGO-Datacloud (RIA 653549) and further developed with co-funding by the projects EOSC-hub (Horizon 2020) under Grant number 777536, DEEP-Hybrid-DataCloud (Horizon 2020) under Grant number 777435, DT-Geo (Horizon Europe) under Grant number 101058129. Software Quality Assurance is performed with the support of by the project EOSC-Synergy (Horizon 2020). The authors wish to acknowleadge the support of INCD-Infraestrutura Nacional de Computação Distribuída (funded by FCT, P2020, Lisboa2020, COMPETE and FEDER under the project number 22153-01/SAICT/2016).

udocker's People

Contributors

a1ve5 avatar alvarolopez avatar castroamarta avatar davidjsherman avatar ericcurtin avatar frankier avatar gboddin avatar isabel-campos-plasencia avatar jopasserat avatar manabuishii avatar mariojmdavid avatar mr-c avatar norpol avatar orviz avatar psafont avatar romainreuillon avatar samuelbernardolip avatar tp81 avatar tzok avatar undu avatar vsoch avatar yarikoptic avatar yuvipanda avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

udocker's Issues

run --name not working

When using run --name the command fails.

Without --name:

[reuillon:~/Documents/Recherche/Projects/openmole/openmole] udocker(+86/-86)+ 23h58m22s ± udocker run hello-world
Warning: non-existing user will be created
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING fc4828eb-32db-3c56-bac3-5e4d9ffc00ea                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: hello

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

With --name:

[reuillon:~/Documents/Recherche/Projects/openmole/openmole] udocker(+86/-86)+ 23h58m23s ± udocker run --name hello hello-world
Error: image or container not available

Unable to Pull Images with uDocker in AWS

Hi,

TL;DR;
Starting today, uDocker yields errors when pulling any image from Docker Hub, when it is run in AWS , either in an EC2 instance (regardless of the OS), or in AWS Lambda.

In order to reproduce this issue:

  1. Run an EC2 instance (we have tried Amazon Linux and Ubuntu 16.04 with similar results).
  2. Install uDocker
  3. Pull a Docker image (the same result is obtained regardless of the image), e.g.
udocker pull ubuntu:16.04
Downloading layer: sha256:50aff78429b146489e8a6cb9334d93a6d81d5de2edc4fbf5e2d4d9253625753e
Error: in download: HTTP/1.1 400 Bad Request
Downloading layer: sha256:f6d82e297bce031a3de1fa8c1587535e34579abce09a61e37f5a225a8667422f
Error: in download: HTTP/1.1 400 Bad Request
Downloading layer: sha256:275abb2c8a6f1ce8e67a388a11f3cc014e98b36ff993a6ed1cc7cd6ecb4dd61b
...

Pulling the image using Docker from that EC2 instance works perfectly. Pulling the image from uDocker running on an on-premises machine, i.e. out of AWS, also works perfectly. Therefore, the issue must be related to the combination of running uDocker in AWS, something that was working fine until today.

Do you have any idea of what could be going on?

Greetings.

How suppress the container execution prolog

Is there a way to suppress the prolog printed in the stdout when a container is executed?

I mean the text:

 ****************************************************************************** 
 *                                                                            * 
 *               STARTING 9e08bb88-4548-3081-a265-310b83be43f0                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: sh

udocker pull from quay.io hangs (seemingly an endless loop)

bioconda containers are published to the quay.io registry after build (using Travis from Github). When trying to pull from this registry using udocker, the tool hangs:

udocker pull quay.io/biocontainers/repeatmasker:4.0.6--pl5.22.0_9

Presumably a --registry flag might fix this but it is not clear (from the udocker side or the quay.io documentation side) what the correct value for this might be.

[Guix docker image] command not found or has no execute bit set

Hi,

Did i miss something or hit a bug ? :)

udocker seems to be ok :

$ udocker run hello-world
Downloading layer: sha256:ca4f61b1923c10e9eb81228bd46bee1dfba02b9c7dac1844527a734752688ede
Downloading layer: sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[u'sha256:ca4f61b1923c10e9eb81228bd46bee1dfba02b9c7dac1844527a734752688ede', u'sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4']
Warning: non-existing user will be created
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING 2ea5750f-aae3-3ca4-8035-2824a29c0593                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: hello

Hello from Docker!
This message shows that your installation appears to be working correctly.

My hello-world docker image exported from Guix seems ok too :

$ docker load --input /gnu/store/qyvx3d5g7x89lkqixpgp646yxgcx3lmd-docker-pack.tar.gz
c79bcef73e29: Loading layer [==================================================>]  73.82MB/73.82MB
Loaded image: profile:77d1v9pr8nh03m8n6jycml7mp82ri93g
$ docker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g hello
Hello, world!
$ docker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g /usr/bin/hello
Hello, world!
$ docker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g /gnu/store/wf65hjwqwpz4wllasn63zysi5irql2sx-hello-2.10/bin/hello
Hello, world!

But if I run it with udocker, i hit "command not found or has no execute bit set"

$ udocker import /gnu/store/qyvx3d5g7x89lkqixpgp646yxgcx3lmd-docker-pack.tar.gz profile:77d1v9pr8nh03m8n6jycml7mp82ri93g
Info: added layer 072a3293e60fa0689008b9414327df778c2cd544ac78e51ed4f1cacc34a23873
$ udocker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g hello
Warning: non-existing user will be created
Error: command not found or has no execute bit set:  ['hello']
$ udocker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g /usr/bin/hello
Warning: non-existing user will be created
Error: command not found or has no execute bit set:  ['/usr/bin/hello']
$ udocker run profile:77d1v9pr8nh03m8n6jycml7mp82ri93g /gnu/store/wf65hjwqwpz4wllasn63zysi5irql2sx-hello-2.10/bin/hello
Warning: non-existing user will be created
Error: command not found or has no execute bit set:  ['/gnu/store/wf65hjwqwpz4wllasn63zysi5irql2sx-hello-2.10/bin/hello']

The files are the same in both :

$ diff <(sudo find /var/lib/docker/aufs/diff/5b90b5da5c4084020be454945ad108054b523ef09e8c8d6355b6db0a1f8a55f9/ \( -type f -o -type l \) -printf '%P\n' | sort) <(tar -tf .udocker/containers/32ba740a-6ca3-304e-90a0-c671941e08a2/ROOT/811a6008cbb0a08ecfa3b6f8a52e92aee5e9dccd77547fc437d2fe836dc20cc2/layer.tar | awk '! /\/$/ {print }' | sort)
$ echo $?
0

Error: proot executable not found

Hi!

I can't get udocker to work anymore. when I run:

$ cd ~
$ rm -rf .udocker
$ curl https://raw.githubusercontent.com/indigo-dc/udocker/master/udocker.py > udocker
$ chmod u+rx ./udocker
$ ./udocker install
$ udocker -D run fedora
tar: Pattern matching characters used in file names
tar: Use --wildcards to enable pattern matching, or --no-wildcards to suppress this warning
tar: *\\/\\.wh\\.*: Not found in archive
tar: Exiting with failure status due to previous errors
tar: Pattern matching characters used in file names
tar: Use --wildcards to enable pattern matching, or --no-wildcards to suppress this warning
tar: *\\/\\.wh\\.*: Not found in archive
tar: Exiting with failure status due to previous errors
tar: Pattern matching characters used in file names
tar: Use --wildcards to enable pattern matching, or --no-wildcards to suppress this warning
tar: *\\/\\.wh\\.*: Not found in archive
tar: Exiting with failure status due to previous errors
bin
boot/
dev/
etc/
etc/.pwd.lock
etc/DIR_COLORS

[....]

var/spool/mail/
var/tmp/
var/yp/
Warning: no command assuming: ['/bin/bash', '-i']
Error: proot executable not found

proot is available as an executable on my host. I also tried the develop branch. Any suggestions?

SIGSEV on 4.8.0

On my system proot generate a segfault:

[reuillon:~/Install/udocker] 20m2s $ ./udocker run hello-world
Warning: non-existing user will be created
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING 8c0e5ff2-f6a1-3427-8b41-e3b614378fda                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: hello
proot info: pid 6527: terminated with signal 11

I think that the function is great than doesn't work. If I print the return of oskernel_isgreater((4, 8, 7)) I get false:

amd64
False

And even with ((4, 8, 0)). I think the patch for 4.8 of proot should be used with any kernel >= 4.8. What do you think ?

Can I run udocker inside a container?

I want to run some basic stuff inside a container and was thinking if I could run udocker in a container without exposing the docker socket to it.

[RFC] Using umoci to unpack and build images?

Hi, is there any interest in using umoci as a backend for image manipulation? It can work entirely without privileges, supports OCI images natively, and implements unprivileged image operations in a more complete manner than the current (quite cool) find cmdline that you're using. It also supports modifying the image configuration, and generating an OCI runtime bundle that runc can use for rootless containers.

You could also then implement something like udocker build (which doesn't appear to be supported at the moment) because umoci also supports "repacking" an image, which adds a new layer containing any changes to the rootfs. If you want an example of how udocker build could be implemented you can take a look at another project I have, orca-build.

The only downside of using umoci is that it only supports OCI images (not Docker images -- since OCI images are the standardised format). However, there are a few saving graces:

  • Docker is going to support OCI images natively, see moby/moby#33355. Eventually it will be the default format for Docker.
  • You can also use tools like skopeo (which I use) to convert from Docker images to OCI images and vice-versa (you can even pull from remote registries with skopeo). I did quite a bit of work to add tests to skopeo to ensure that OCI <-> Docker round-trips will not break. skopeo also supports interacting with docker save-style archives which could help with implementing #74.

If you'd like any more information, feel free to ping me.

Support for the save operation (creating tarball of a Docker image)

Hi,

udocker supports loading container images (created via the docker save command). However it does not support saving container images into a tarball that can be later imported by udocker itself.

This functionality would be used when you do not have constant access neither to a Docker installation nor to Docker Hub. You would use udocker to pull once from Docker Hub and later export the image that could be loaded by other udocker deployments.

To sum up, is udocker save planning to be implemented? We would really much appreciate that functionality.

official postgresql docker fails with "Error: invalid volume destination path: {}"

Hi folks,

when I run official postgresql the start fails:

./udocker.py run -i -t --user postgres  --rm -v /tmp/:/home/postgres -v /var/lib/postgresql/data postgres:9.5 bash
Warning: this container exposes TCP/IP ports
Error: invalid volume destination path: {}

The problem appears to be in that metadata extraction call (line 2091):

                self.opt["vol"].extend(
                    container_structure.get_container_meta(
                        "Volumes", [], container_json))

Instead of /var/lib/postgresql/data this call returns /var/lib/postgresql/data:{} .... so no idea if this bug can be fixed in udocker.py or it is a dependency...

If I add a vol=vol.replace(':{}','') into the check_volumes method I can start postgresql server and connect to it:

rm -rf /tmp/pg && mkdir -p /tmp/pg && ./udocker.py run -i -t --user postgres  --rm --volume=/tmp:/home/postgres --volume=/tmp/pg:/var/lib/postgresql/data postgres:9.5 sh -c '/usr/lib/postgresql/9.5/bin/initdb && /usr/lib/postgresql/9.5/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start && psql && killall postgres'

greets Stefan

Cannot run sh in a container with udocker

I'm trying to execute sh in a container, but I get this error:

$ udocker run --rm undu/imagemagick sh
Error: command not found or has no execute bit set:  ['sh']

with docker it work just fine (with --it I can input commands otherwise it finishes instantly)

However if I use its absolute path in the container it works fine:

$ udocker run --rm undu/imagemagick /bin/sh

 ******************************************************************************
 *                                                                            *
 *               STARTING 2c2b0f42-8c5f-3a90-82aa-fcf8aba1a5b3                *
 *                                                                            *
 ******************************************************************************
 executing: sh
2c2b0f42[]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

As you can see, /bin is also in PATH, other tools in the path (but a different folder) work without needed the absolute path:

$ udocker run --rm undu/imagemagick convert --version

 ******************************************************************************
 *                                                                            *
 *               STARTING 224d472e-5338-3052-97c2-c191b231f504                *
 *                                                                            *
 ******************************************************************************
 executing: convert
Version: ImageMagick 7.0.5-10 Q16 x86_64 2017-06-05 http://www.imagemagick.org
Copyright: © 1999-2017 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher HDRI Modules
Delegates (built-in): fontconfig freetype gslib jng jpeg lcms ltdl png ps tiff webp xml zlib

which doesn't work either, it's located in /usr/bin/which, same folder as convert

Any ideas on what might be happening?
Maybe I shouldn't expect it to work like docker?

[Minor] extra `.udocker` directory created when setting custom paths

Just a tiny glitch.

When setting the environment variables to customise the various udocker paths, a .udocker directory is still created under ${HOME} and remains empty as the custom locations will then take precedence.

Example with the following environment variables set:

export UDOCKER_DIR=/homes/jpassera/playground/udocker_workspace/udocker
export UDOCKER_TMPDIR=/homes/jpassera/playground/udocker_workspace
export UDOCKER_TARBALL=/homes/jpassera/playground/udocker-tarball.tgz
export UDOCKER_LOGLEVEL=1
export HOME=/homes/jpassera/playground/udocker_workspace/
export UDOCKER_CONTAINERS=/homes/jpassera/playground/udocker_workspace/containers
export UDOCKER_REPOS=/homes/jpassera/playground/udocker_workspace/repos
export UDOCKER_LAYERS=/homes/jpassera/playground/udocker_workspace/layers

generates the following outputs:

# check folders don't exist yet
jpassera@hornbeam:/homes/jpassera/playground$ ls udocker_workspace
ls: cannot access udocker_workspace: No such file or directory
jpassera@hornbeam:/homes/jpassera/playground$ ls /homes/jpassera/.udocker
ls: cannot access /homes/jpassera/.udocker: No such file or directory

# run creation and thus folders creation
jpassera@hornbeam:/homes/jpassera/playground$ ./udocker version
udocker 1.0.3

# $HOME taken into account
jpassera@hornbeam:/homes/jpassera/playground$ ls /homes/jpassera/.udocker
ls: cannot access /homes/jpassera/.udocker: No such file or directory

# but a residual .udocker is created under new $HOME
jpassera@hornbeam:/homes/jpassera/playground$ ls -a udocker_workspace
.  ..  containers  layers  repos  udocker  .udocker

Add --port-map option to proot

proot --port-map makes proot transparently remap the network port between client and server. It is super useful when running several times the same client/server process concurrently on the same machine. Otherwise the it will crash because the server port is already allocated.

udocker run doesn't automatically do a pull

with udocker 1.1.0-RC2 contrast:

$ udocker run ubuntu:zesty
Error: image or container not available

with:

$ docker run ubuntu:zesty
Unable to find image 'ubuntu:zesty' locally
zesty: Pulling from library/ubuntu
6a5614abc691: Pull complete 
aa4d067130d8: Pull complete 
831c7598833c: Pull complete 
6a410fc1d3bf: Pull complete 
3271f041ee12: Pull complete 
Digest: sha256:a5a0e5c797e831f448307fecacbed7d0b66bf127e8e83a037381fb00a6dff858
Status: Downloaded newer image for ubuntu:zesty

after a udocker pull ubuntu:zesty, we see:

$ udocker run ubuntu:zesty 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING 22095dd0-8672-373e-9a48-e0fcff6a3a95                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: bash

My user expectation is that udocker will work like docker and do a pull if the image is not available.

Import with no tag behave differently in docker and udocker

[reuillon:~/Install/udocker] devel 40m49s 1 ± udocker import /tmp/httptest.tar
Error: must specify image:tag or repository/image:tag
[reuillon:~/Install/udocker] devel 40m52s 1 ± docker import /tmp/httptest.tar
sha256:18dbdb39a6771699559b97594997f4bdf7ff9b2b81d2d874924e58ab1304f465

Help interpreting error on "python udocker pull [image]"

Hi there 👋

I am running this script on AWS Lambda:

export HOME=/tmp
export UDOCKER_DIR=/tmp
export UDOCKER_BIN=/tmp
export UDOCKER_LIB=/tmp
export UDOCKER_CONTAINERS=/tmp

cd /tmp

curl https://raw.githubusercontent.com/indigo-dc/udocker/devel/udocker.py >udocker
chmod +x ./udocker

python udocker version # prints -> version: 1.1.1
# also prints -> tarball: https://owncloud.indigo-datacloud.eu/index.php/s/AFImjw8ii0X72xf/download https://cernbox.cern.ch/index.php/s/VC7GuVWA7mYRAiy/download http://repo.indigo-datacloud.eu/repository/indigo/2/centos7/x86_64/tgz/udocker-1.1.1.tar.gz

# Pull image
python udocker pull quay.io/skilbjo/iris:x86 # failure occurs here
# failure occurs also with a more mainstream image like ubuntu:17.10

and here is my stack trace

File "udocker", line 6725, in <module>
sys.exit(Main().start())
File "udocker", line 6638, in __init__
Config().user_init(self.cmdp.get("--config=", "GEN_OPT"))
File "udocker", line 322, in user_init
if self._read_config(config_file):
File "udocker", line 298, in _read_config
data = cfile.getdata()
File "udocker", line 911, in getdata
buf = filep.read()
OSError: [Errno 14] Bad address

I'm having trouble interpreting it, does this look familiar to anyone?

Cannot Run Alpine-based images with Fakechroot (F1) Execution Mode

Hi,

Attempting to run a Docker container based on the alpine:latest Docker image using uDocker with the F1 execution mode results in the following error:

udocker create --name=test-alpine alpine:latest
udocker setup --execmode=P1 test-alpine
udocker run test-alpine sh

_Warning: running as uid 0 is not supported by this engine
Warning: non-existing user will be created
Error: command not found or has no execute bit set:  ['sh']_

Since many commands are symlinks to /bin/busybox, attempting to execute that results in:

udocker run test-alpine /bin/busybox

_Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __snprintf_chk: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __vfprintf_chk: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __chk_fail: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: rawmemchr: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __memmove_chk: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __rawmemchr: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __strcpy_chk: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __fprintf_chk: symbol not found
Error relocating /home/ubuntu/.udocker/lib/libfakechroot-Ubuntu-16-x86_64.so: __sprintf_chk: symbol not found_

Is there any workaround to this issue? Changing the execution mode to Proot solves the problem but we need to stick to the F1 execution mode.

Thank you in advance.

Problem when the binary is not in /opt/

Hello udocker team.

I am trying to use udocker on a slurm cluster but I have some strange problems.
When I install a container that the binary is in /opt/name_of_tool/tool directory the command runs fine.
The problem occurs when the binary isn't there.

For example, I have the bwa container and if I give the following command:

./udocker run -v /home:/home -w /home/vlenis/ align bwa mem

The tool runs.
When I am trying to give input data like:

./udocker run -v /home:/home -w /home/vlenis/ align bwa mem –M –Y /home/vlenis/REF/HumanNCBI37_UCSC_XY.fa /home/vlenis/FASTQ/LP6005115-DNA_A08_1.fq /home/vlenis/FASTQ/LP6005115-DNA_A08_2.fq > /home/vlenis/BWA_Map/LP6005115-DNA_A08_1.sam

I have the following error:

Traceback (most recent call last): File "./udocker", line 6663, in <module> sys.exit(Main().start()) File "./udocker", line 6651, in start exit_status = self.execute() File "./udocker", line 6635, in execute status = cmds[command](self.cmdp) # executes the command File "./udocker", line 6016, in do_run status = exec_engine.run(container_id) File "./udocker", line 2545, in run cmd += " ".join(self.opt["cmd"]) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 8: ordinal not in range(128)

I am really sorry for the trouble but I am quite new in this kind of software.

Thank you very much in advance,
Vasilis.

Random segfault

I get random segfault when running:
udocker run ubuntu:latest bash -c "apt update ; apt install -y cowsay"

Around 1 on 2 times I get:

****************************************************************************** 
 *                                                                            * 
 *               STARTING 852019b1-51db-34c5-8de2-84deead509bd                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: bash
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease  
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]           
Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]                  
Get:5 http://security.ubuntu.com/ubuntu xenial-security/universe Sources [53.1 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial/universe Sources [9802 kB]        
Get:7 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [505 kB]                  
Get:8 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [229 kB] 
Get:9 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [3479 B]
Get:10 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [9827 kB]
Get:11 http://archive.ubuntu.com/ubuntu xenial/multiverse amd64 Packages [176 kB]                                                                                      
Get:12 http://archive.ubuntu.com/ubuntu xenial-updates/universe Sources [231 kB]                                                                                       
Get:13 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [866 kB]                                                                                    
Get:14 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [13.7 kB]                                                                             
Get:15 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [719 kB]                                                                                
Get:16 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 Packages [18.5 kB]                                                                             
Get:17 http://archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages [5174 B]                                                                                  
Get:18 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [7150 B]                                                                              
Fetched 22.8 MB in 7s (2873 kB/s)                                                                                                                                      
Reading package lists... Done
Building dependency tree       
Reading state information... Done
2 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  cowsay-off ifupdown iproute2 isc-dhcp-client isc-dhcp-common libatm1 libdns-export162 libgdbm3 libisc-export160 libmnl0 libperl5.22 libtext-charwidth-perl
  libxtables11 netbase perl perl-modules-5.22 rename
Suggested packages:
  filters ppp rdnssd iproute2-doc resolvconf avahi-autoipd isc-dhcp-client-ddns apparmor perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make
The following NEW packages will be installed:
  cowsay cowsay-off ifupdown iproute2 isc-dhcp-client isc-dhcp-common libatm1 libdns-export162 libgdbm3 libisc-export160 libmnl0 libperl5.22 libtext-charwidth-perl
  libxtables11 netbase perl perl-modules-5.22 rename
0 upgraded, 18 newly installed, 0 to remove and 2 not upgraded.
Need to get 8149 kB of archives.
After this operation, 44.8 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 libatm1 amd64 1:2.5.1-1.5 [24.2 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial/main amd64 libmnl0 amd64 1.0.3-5 [12.0 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial/main amd64 libgdbm3 amd64 1.8.3-13.1 [16.9 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 perl-modules-5.22 all 5.22.1-9ubuntu0.2 [2661 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libperl5.22 amd64 5.22.1-9ubuntu0.2 [3391 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 perl amd64 5.22.1-9ubuntu0.2 [237 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 iproute2 amd64 4.3.0-1ubuntu3.16.04.2 [522 kB]
Get:8 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 ifupdown amd64 0.8.10ubuntu1.2 [54.9 kB]
Get:9 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libisc-export160 amd64 1:9.10.3.dfsg.P4-8ubuntu1.9 [153 kB]
Get:10 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libdns-export162 amd64 1:9.10.3.dfsg.P4-8ubuntu1.9 [666 kB]
Get:11 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 isc-dhcp-client amd64 4.3.3-5ubuntu12.7 [223 kB]
Get:12 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 isc-dhcp-common amd64 4.3.3-5ubuntu12.7 [105 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial/main amd64 libtext-charwidth-perl amd64 0.04-7build5 [9248 B]
Get:14 http://archive.ubuntu.com/ubuntu xenial/main amd64 libxtables11 amd64 1.6.0-2ubuntu3 [27.2 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial/main amd64 netbase all 5.3 [12.9 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial/universe amd64 cowsay all 3.03+dfsg1-15 [18.0 kB]
Get:17 http://archive.ubuntu.com/ubuntu xenial/universe amd64 cowsay-off all 3.03+dfsg1-15 [3640 B]
Get:18 http://archive.ubuntu.com/ubuntu xenial/main amd64 rename all 0.20-4 [12.0 kB]
Fetched 8149 kB in 2s (2908 kB/s) 
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libatm1:amd64.
(Reading database ... 4768 files and directories currently installed.)
Preparing to unpack .../libatm1_1%3a2.5.1-1.5_amd64.deb ...
Unpacking libatm1:amd64 (1:2.5.1-1.5) ...
Selecting previously unselected package libmnl0:amd64.
Preparing to unpack .../libmnl0_1.0.3-5_amd64.deb ...
Unpacking libmnl0:amd64 (1.0.3-5) ...
Selecting previously unselected package libgdbm3:amd64.
Preparing to unpack .../libgdbm3_1.8.3-13.1_amd64.deb ...
Unpacking libgdbm3:amd64 (1.8.3-13.1) ...
Selecting previously unselected package perl-modules-5.22.
Preparing to unpack .../perl-modules-5.22_5.22.1-9ubuntu0.2_all.deb ...
Unpacking perl-modules-5.22 (5.22.1-9ubuntu0.2) ...
Selecting previously unselected package libperl5.22:amd64.
Preparing to unpack .../libperl5.22_5.22.1-9ubuntu0.2_amd64.deb ...
Unpacking libperl5.22:amd64 (5.22.1-9ubuntu0.2) ...
Selecting previously unselected package perl.
Preparing to unpack .../perl_5.22.1-9ubuntu0.2_amd64.deb ...
Unpacking perl (5.22.1-9ubuntu0.2) ...
Selecting previously unselected package iproute2.
Preparing to unpack .../iproute2_4.3.0-1ubuntu3.16.04.2_amd64.deb ...
Unpacking iproute2 (4.3.0-1ubuntu3.16.04.2) ...
Selecting previously unselected package ifupdown.
Preparing to unpack .../ifupdown_0.8.10ubuntu1.2_amd64.deb ...
Unpacking ifupdown (0.8.10ubuntu1.2) ...
Selecting previously unselected package libisc-export160.
Preparing to unpack .../libisc-export160_1%3a9.10.3.dfsg.P4-8ubuntu1.9_amd64.deb ...
Unpacking libisc-export160 (1:9.10.3.dfsg.P4-8ubuntu1.9) ...
Selecting previously unselected package libdns-export162.
Preparing to unpack .../libdns-export162_1%3a9.10.3.dfsg.P4-8ubuntu1.9_amd64.deb ...
Unpacking libdns-export162 (1:9.10.3.dfsg.P4-8ubuntu1.9) ...
Selecting previously unselected package isc-dhcp-client.
Preparing to unpack .../isc-dhcp-client_4.3.3-5ubuntu12.7_amd64.deb ...
Unpacking isc-dhcp-client (4.3.3-5ubuntu12.7) ...
Selecting previously unselected package isc-dhcp-common.
Preparing to unpack .../isc-dhcp-common_4.3.3-5ubuntu12.7_amd64.deb ...
Unpacking isc-dhcp-common (4.3.3-5ubuntu12.7) ...
Selecting previously unselected package libtext-charwidth-perl.
Preparing to unpack .../libtext-charwidth-perl_0.04-7build5_amd64.deb ...
Unpacking libtext-charwidth-perl (0.04-7build5) ...
Selecting previously unselected package libxtables11:amd64.
Preparing to unpack .../libxtables11_1.6.0-2ubuntu3_amd64.deb ...
Unpacking libxtables11:amd64 (1.6.0-2ubuntu3) ...
Selecting previously unselected package netbase.
Preparing to unpack .../archives/netbase_5.3_all.deb ...
Unpacking netbase (5.3) ...
Selecting previously unselected package cowsay.
Preparing to unpack .../cowsay_3.03+dfsg1-15_all.deb ...
Unpacking cowsay (3.03+dfsg1-15) ...
Selecting previously unselected package cowsay-off.
Preparing to unpack .../cowsay-off_3.03+dfsg1-15_all.deb ...
Unpacking cowsay-off (3.03+dfsg1-15) ...
dpkg-deb: error: subprocess <decompress> was killed by signal (Segmentation fault), core dumped
dpkg: error processing archive /var/cache/apt/archives/cowsay-off_3.03+dfsg1-15_all.deb (--unpack):
 subprocess dpkg-deb --fsys-tarfile returned error exit status 2
Selecting previously unselected package rename.
Preparing to unpack .../archives/rename_0.20-4_all.deb ...
Unpacking rename (0.20-4) ...
Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Errors were encountered while processing:
 /var/cache/apt/archives/cowsay-off_3.03+dfsg1-15_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

My system info is:
Linux simplet 4.13.0-17-generic #20-Ubuntu SMP Mon Nov 6 10:04:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

And for udocker:

[reuillon:~/.openmole/simplet] 7m40s 1 $ udocker version
version: 1.1.1
tarball: https://owncloud.indigo-datacloud.eu/index.php/s/AFImjw8ii0X72xf/download https://cernbox.cern.ch/index.php/s/VC7GuVWA7mYRAiy/download http://repo.indigo-datacloud.eu/repository/indigo/2/centos7/x86_64/tgz/udocker-1.1.1.tar.gz

How I could help to diagnose this bug further?

cheers,
Romain

Import image is destructive in udocker

In docker:

[reuillon:~/Install/udocker] devel 30m18s 2 ± docker export -o /tmp/httptest.tar httptest
[reuillon:~/Install/udocker] devel 30m22s ± docker import /tmp/httptest.tar youpi
sha256:7137bd607326a8d778f0991ae8c25c563ed7d56c05ae3eaa55dfdb785146390c
[reuillon:~/Install/udocker] devel 30m29s ± ls /tmp/httptest.tar
/tmp/httptest.tar

In udocker:

[reuillon:~/Install/udocker] devel 29m36s ± docker export -o /tmp/httptest.tar httptest
[reuillon:~/Install/udocker] devel 29m53s ± udocker import /tmp/httptest.tar youpi
Info: added layer aa602f9bbc2c4cef431ffc6e01c5dc8eef869abb21a826d296f08d575186c7b0
[reuillon:~/Install/udocker] devel 29m57s ± ls /tmp/httptest.tar
ls: impossible d'accéder à '/tmp/httptest.tar': Aucun fichier ou dossier de ce type

Udocker not working with python 3

Hi, when executing udocker in a python 3 environment I get the following error:

Traceback (most recent call last):
  File "udocker", line 5844, in <module>
    sys.exit(Main().start())
  File "udocker", line 5757, in __init__
    if not self.cmdp.parse(sys.argv):
  File "udocker", line 5618, in parse
    if arg[0] in string.letters:
AttributeError: module 'string' has no attribute 'letters'

Looks like an incompatibility with the python libraries.
Are you planning on supporting python 3?

Thanks

Discrepancy from docker in behaviour of -v

In docker:

[reuillon:~/Install/udocker] devel 19m55s ± docker run -v "$PWD/tox.ini:tox.ini" ubuntu ls
docker: Error response from daemon: invalid bind mount spec "/home/reuillon/Install/udocker/tox.ini:tox.ini": invalid volume specification: '/home/reuillon/Install/udocker/tox.ini:tox.ini': invalid mount config for type "bind": invalid mount path: 'tox.ini' mount path must be absolute.
See 'docker run --help'.

In udocker:

[reuillon:~/Install/udocker] devel 21m43s 125 ± udocker run -v "$PWD/tox.ini:tox.ini" ubuntu ls
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING cce75d54-9cc2-3467-8440-49ee28b672c8                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

Image[@digest]

Allow images to be specified using digests. For example, udocker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date

udocker installation fails

Following the installation guide at https://github.com/indigo-dc/udocker/blob/master/doc/installation_manual.md udocker installation currently fails: the proper version of udocker 1.1.1 seems not to be present in the download repository:

$ ./udocker install
Info: creating repo: /home/sustr4/.udocker
Info: installing 1.1.1
Info: installing from: http://repo.indigo-datacloud.eu/repository/indigo/2/centos7/x86_64/tgz/udocker-    1.1.1.tar.gz
Error: in download: HTTP/1.1 404 Not Found
Info: installing from: https://owncloud.indigo-datacloud.eu/index.php/s/AFImjw8ii0X72xf/download

Cannot pull image becuase of proxy

Is there a way to configure http proxy?

$ ./udocker pull --httpproxy=$MYPROXY fedora
Error: image not found
Error: no files downloaded

create --name doesn't work with long alphanumeric strings

Trying to create a container with --name="an uuid" raises an error:

[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 11m29s 123 ± udocker ps
CONTAINER ID                         P M NAMES              IMAGE
[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 13m36s ± udocker create --name=da313a28-6773-48f9-9efc-1658995ad147 r-base
49e3b2fd-d413-3171-8fb6-d2c261548776
Error: invalid container name may already exist or wrong format
[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 13m51s 1 ± udocker create --name=da313a28677348f99efc1658995ad147 r-base
0c67def4-a9e7-3e4d-ba0d-466dacf527cc
Error: invalid container name may already exist or wrong format
[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 14m4s 1 ± udocker create --name="da313a28-6773-48f9-9efc-1658995ad147" r-base
56f00483-2a31-3531-8882-8a219a699b6b
Error: invalid container name may already exist or wrong format
[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 14m53s 1 ± udocker ps
CONTAINER ID                         P M NAMES              IMAGE
56f00483-2a31-3531-8882-8a219a699b6b . W                    r-base:latest
49e3b2fd-d413-3171-8fb6-d2c261548776 . W                    r-base:latest
0c67def4-a9e7-3e4d-ba0d-466dacf527cc . W                    r-base:latest
[reuillon:~/Documents/Recherche/Projects/openmole/openmole] master(+385/-226)+ 14m58s ± udocker create --name='da313a28-6773-48f9-9efc-1658995ad147' r-base
ae927483-0a62-320a-847c-7dd7e63ff0ad
Error: invalid container name may already exist or wrong format

Discrepany in -e behaviour

The -e option when provided with an environment variable propagate it to the container. This is not working in udocker.

[reuillon:~/Install/udocker] tmpdir 4h12m31s 125 ± docker run -e YOUPI ubuntu env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=82cc8592a7ef
YOUPI=youpi
HOME=/root
[reuillon:~/Install/udocker] tmpdir 4h12m36s ± ./udocker run -e YOUPI ubuntu env

****************************************************************************** 
*                                                                            * 
*               STARTING 73dbcbcb-4760-336d-97de-554fba6d8b53                * 
*                                                                            * 
****************************************************************************** 
executing: env
/bin/sh: 1: YOUPI: not found

udocker ignores further elements in ENTRYPOINT JSON array

Apparently udocker misses any elements in the JSON array passed in the ENTRYPOINT statement in a dockerfile.

Say I have a container running a python scripts, with arguments. I
want the script name to be in the entry point, and provide default
arguments via CMD, something like

ENTRYPOINT [“/usr/bin/python”,”myscript.py”]
CMD [“100”]

This works in Docker, while udocker apparently misses the second
piece in the array, since the outcome is

/usr/bin/python: can't open file ’100': [Errno 2] No such file or directory

which I assume means it is passing “100” as an argument directly to
/usr/bin/python.

Udocker does not correctly parse multine commands

For some reason it parses the new line as another parameter

We can see this in a very minimal example:

$ echo 'foo
> bar'
foo
bar

Docker's behaviour:

$ docker run alpine echo 'foo
bar'
foo
bar

Running the command using udocker:

$ udocker run alpine echo 'foo
 bar'

 ******************************************************************************
 *                                                                            *
 *               STARTING 263b9347-9379-3a18-bb1b-10da1bcc4dec                *
 *                                                                            *
 ******************************************************************************
 executing: echo
foo
/bin/sh: line 1: bar: command not found

This happens with other images too:

$ udocker run debian echo 'foo
bar'

 ******************************************************************************
 *                                                                            *
 *               STARTING 344b1d42-99c4-38b2-a44b-67096b2d6832                *
 *                                                                            *
 ******************************************************************************
 executing: echo
foo
/bin/sh: line 1: bar: command not found

It's worth noting that the second line does not seem to be executed when it's a valid command:

$ udocker run alpine echo 'foo
echo bar'

 ******************************************************************************
 *                                                                            *
 *               STARTING 747a6150-f3ec-3fca-ba0c-300617b8dcb6                *
 *                                                                            *
 ******************************************************************************
 executing: echo
foo
echo bar

"Error: delete not owner" when udocker pull

Hi,
I am getting the following error:

→  udocker.py pull ubuntu:16.04
Downloading layer: sha256:8aec416115fdbd74102c9090bcfe03bfe8926876642d8846c8b917959ea9b552
Error: delete not owner:  /tmp/udocker-23428-007c1682-0695-35b8-9740-6b7dda757070-execurl_out
Error: delete not owner:  /tmp/udocker-23428-7d1bbe79-b532-38b7-9224-6fddc1308dea-execurl_out
Downloading layer: sha256:695f074e24e392178d364af5ea2405dda7ab0035284001b49939afac5106c187
Error: delete not owner:  /tmp/udocker-23428-92c36e3a-ce7a-321c-a6bd-d245356e2ccf-execurl_out
Error: delete not owner:  /tmp/udocker-23428-13167cd3-cc5b-3ff0-aa11-877992fa8c12-execurl_out
Downloading layer: sha256:946d6c48c2a7d60cb2f4d1c4d3a8131086b412d11a9def59d0bcc0892428dde9
Error: delete not owner:  /tmp/udocker-23428-7f3e34eb-d4c7-3136-9472-c32bb2fe6aa2-execurl_out
Error: delete not owner:  /tmp/udocker-23428-07e19cd1-5cd9-387a-8fde-91addbb29fcb-execurl_out
Downloading layer: sha256:bc7277e579f03a13476b4d2dc6607124f7e67341dbd58f9d1cd6555bec086c04
Error: delete not owner:  /tmp/udocker-23428-92e9bc3c-4823-3476-9058-c1e511af19b4-execurl_out
Error: delete not owner:  /tmp/udocker-23428-02093b60-b1ba-3ff0-9c83-a87a74b677de-execurl_out
Downloading layer: sha256:2508cbcde94b50cd53356e8730bb508ddb43c76664a35dc29e69bb8b56a0f531
Error: delete not owner:  /tmp/udocker-23428-7351f2a0-b5e8-3d27-9f88-a877ac24de76-execurl_out
Error: delete not owner:  /tmp/udocker-23428-244d4511-929c-3269-942a-8d0df082c8b2-execurl_out
Downloading layer: sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
Error: delete not owner:  /tmp/udocker-23428-29d39ffa-e010-3ea3-9eb3-084eb4fe1dbd-execurl_out
Error: delete not owner:  /tmp/udocker-23428-fe4ba46a-67d7-3ca2-b2a0-1ba392e12432-execurl_out
[u'sha256:8aec416115fdbd74102c9090bcfe03bfe8926876642d8846c8b917959ea9b552', u'sha256:695f074e24e392178d364af5ea2405dda7ab0035284001b49939afac5106c187', u'sha256:946d6c48c2a7d60cb2f4d1c4d3a8131086b412d11a9def59d0bcc0892428dde9', u'sha256:bc7277e579f03a13476b4d2dc6607124f7e67341dbd58f9d1cd6555bec086c04', u'sha256:2508cbcde94b50cd53356e8730bb508ddb43c76664a35dc29e69bb8b56a0f531', u'sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4']
Error: delete not owner:  /tmp/udocker-23428-02093b60-b1ba-3ff0-9c83-a87a74b677de-execurl_out
Error: delete not owner:  /tmp/udocker-23428-07e19cd1-5cd9-387a-8fde-91addbb29fcb-execurl_out
Error: delete not owner:  /tmp/udocker-23428-007c1682-0695-35b8-9740-6b7dda757070-execurl_out
Error: delete not owner:  /tmp/udocker-23428-7d1bbe79-b532-38b7-9224-6fddc1308dea-execurl_out
Error: delete not owner:  /tmp/udocker-23428-92e9bc3c-4823-3476-9058-c1e511af19b4-execurl_out
Error: delete not owner:  /tmp/udocker-23428-7351f2a0-b5e8-3d27-9f88-a877ac24de76-execurl_out
Error: delete not owner:  /tmp/udocker-23428-244d4511-929c-3269-942a-8d0df082c8b2-execurl_out
Error: delete not owner:  /tmp/udocker-23428-13167cd3-cc5b-3ff0-aa11-877992fa8c12-execurl_out
Error: delete not owner:  /tmp/udocker-23428-fe4ba46a-67d7-3ca2-b2a0-1ba392e12432-execurl_out
Error: delete not owner:  /tmp/udocker-23428-92c36e3a-ce7a-321c-a6bd-d245356e2ccf-execurl_out
Error: delete not owner:  /tmp/udocker-23428-29d39ffa-e010-3ea3-9eb3-084eb4fe1dbd-execurl_out
Error: delete not owner:  /tmp/udocker-23428-7f3e34eb-d4c7-3136-9472-c32bb2fe6aa2-execurl_out

when trying to pull an image, but the files are actually deleted.

It seems that the elif clause at line 603:

elif self.uid() != os.getuid():
            Msg().err("Error: delete not owner: ", filename)
            return False

is causing it. What can I do to avoid this?
Many thanks

Home directory not correct

I have been experiencing an issue with udocker which does not respect the home directory which is set in the original docker container. In my Dockerfile I specify

ENV USER root ENV HOME /root WORKDIR $HOME

However, when running this container with uDocker the HOME env variable is overwritten to

root@blah:/root# echo $HOME /

If I try specify the home directly via the -e HOME=/root in the run parameters nothing changes and I still have an incorrect home directory for root.

I think the env variables are parsed too early and are being overwritten by some hard coded default. If the original docker container HOME env variable cannot be kept, there should at least be a manual method to set the specific HOME environment variable via the run parameters.

Use pex to distribute a single executable file

Dear maintainers,

I appreciate that udocker is a single file for ease of installation, but its monolithic nature makes contributions difficult.

I suggest that udocker

  1. be split into multiple files
  2. be packaged using pex for single file distribution. pexd archives are compatible with any Python 2.6+ system, no setup required.
  3. Over time some of the functions can be replaced with 3rd party convenience libraries.

I would be happy to assist with the above.

udocker not able to load OCI images

I build an OCI complaint image using umoci and I can load it pretty fine with docker load, but udocker load is failing

Warning: unkwnon file in image: /tmp/udocker-19-f6c1c0f1-b4c0-3c42-91fa-44908957118d-import/sha256:37ecd960a269fa495e2667eb9e4151c6af35441b5fb78273eb3d2a57f811916c
Warning: unkwnon file in image: /tmp/udocker-19-f6c1c0f1-b4c0-3c42-91fa-44908957118d-import/sha256:d7e33c1a7ea84f534a4345e60d3f7514e7f12db8f363f4332d71514d4119a3b5
Traceback (most recent call last):
  File "/usr/local/bin/udocker", line 6663, in <module>
    sys.exit(Main().start())
  File "/usr/local/bin/udocker", line 6651, in start
    exit_status = self.execute()
  File "/usr/local/bin/udocker", line 6635, in execute
    status = cmds[command](self.cmdp)     # executes the command
  File "/usr/local/bin/udocker", line 5630, in do_load
    repos = self.dockerlocalfileapi.load(imagefile)
  File "/usr/local/bin/udocker", line 5320, in load
    repositories = self._load_image(structure, imagerepo, tag)
  File "/usr/local/bin/udocker", line 5250, in _load_image
    top_layer_id = self._find_top_layer_id(structure)
  File "/usr/local/bin/udocker", line 5189, in _find_top_layer_id
    my_layer_id = structure["layers"].keys()[0]
IndexError: list index out of range

This is my Dockerfile

FROM debian:sid-slim AS test-rootfs
LABEL maintainer "noel[dot]georgi[at]reancloud[dot]com"
ARG CHEFDK_VERSION=13.6.4-1
RUN apt-get update && \
    apt-get install --no-install-recommends -y ansible python-pip curl && \
    curl https://omnitruck.chef.io/install.sh | bash -s -- -P chef -v ${CHEFDK_VERSION} && \
    pip install awscli && \
    apt-get purge -y python-pip && \
    apt-get -y autoremove && \
    rm -rf /var/lib/apt/lists/ && \
    mkdir -p /opt/data

FROM alpine:3.7 AS umoci
ARG UMOCI_URL=https://github.com/openSUSE/umoci/releases/download/v0.3.1/umoci.amd64
ARG UMOCI_ASC=https://github.com/openSUSE/umoci/releases/download/v0.3.1/umoci.amd64.asc
ARG UMOCI_SHA256=68a4d5864d936bf6e3826dc0147c45f081d1c0b047cbb30f97d13df7d890dc5d
ARG GPG_KEYSERVER=keyserver.opensuse.org
ARG GPG_KEY=9E18AA267DDB8DB4
RUN apk update --no-cache && \
    apk add curl gnupg && \
    gpg --keyserver ${GPG_KEYSERVER} --recv-key ${GPG_KEY} && \
    curl -SL -o $(basename ${UMOCI_URL}) ${UMOCI_URL} && \
    curl -SL -o $(basename ${UMOCI_ASC}) ${UMOCI_ASC} && \
    echo "${UMOCI_SHA256}  $(basename  ${UMOCI_URL})" | sha256sum -c && \
    gpg --batch --verify $(basename ${UMOCI_ASC}) $(basename ${UMOCI_URL}) && \
    mv $(basename ${UMOCI_URL}) /usr/local/bin/umoci && \
    chmod +x /usr/local/bin/umoci

FROM alpine:3.7 AS oci-image-builder
COPY --from=umoci /usr/local/bin/umoci /usr/local/bin/umoci
RUN umoci init --layout test && \
    umoci new --image test:latest && \
    umoci unpack --image test:latest test-oci
COPY --from=test-rootfs / test-oci/rootfs/
RUN umoci repack --image test:latest test-oci/

FROM ubuntu:17.04 as skopeo
ARG SKOPEO_REPO=https://github.com/projectatomic/skopeo.git
RUN apt-get update && apt-get install -y \
    golang \
    btrfs-tools \
    git-core \
    libdevmapper-dev \
    libgpgme11-dev \
    go-md2man \
    libglib2.0-dev \
    libostree-dev
ENV GOPATH=/
WORKDIR /src/github.com/projectatomic/
    RUN git clone ${SKOPEO_REPO} && \
    cd skopeo && \
    make binary-local && \
    cp skopeo /usr/local/bin/
COPY docker/policy.json /etc/containers/
WORKDIR /
COPY --from=oci-image-builder /test/ /test/
RUN skopeo copy oci:test docker-archive:test.tar.gz:test:latest

FROM alpine:3.7 AS udocker-installer
ARG UDOCKER_URL=https://raw.githubusercontent.com/indigo-dc/udocker/master/udocker.py
RUN apk update && \
    apk add curl && \
    curl -o /usr/local/bin/udocker ${UDOCKER_URL} && \
    chmod +x /usr/local/bin/udocker

FROM ${ARTIFACTORY}/${ENVIRONMENT}/tomcat:${TAG}
COPY --from=udocker-installer /usr/local/bin/udocker /usr/local/bin/udocker
COPY --from=skopeo --chown=tomcat:tomcat /test.tar.gz /tmp/
USER root
RUN apk add --no-cache python tar findutils file su-exec bash && \
	su-exec tomcat udocker install && \
    su-exec tomcat udocker load -i /tmp/test.tar.gz

Importing the same container multiple times doesn't behave the same as in docker

[reuillon:~/Install/udocker] devel 34m53s ± udocker import /tmp/httptest.tar youpi
Error: tag already exists in repo:  latest
Error: importing file
[reuillon:~/Install/udocker] devel 34m56s 1 ± docker import /tmp/httptest.tar youpi
sha256:2ab8ff990b73e9a5ff10d06c2ae809ea7dc1f1faffc84c8dbdbffa6f9877c855
[reuillon:~/Install/udocker] devel 35m2s ± docker import /tmp/httptest.tar youpi
sha256:13a6a8a6718c86bd5222bf311fa4be7d19f33f14d38abf3d76e5452bc1996675

Container stdout is not redirect to the host stdout

Is the container stdout/stderr supposed to be redirected to the host stdout/stderr standard files?

I was expecting that also because there's the cli option -nosysdir that says do not bind the host /proc /sys /run /dev.

However if I run the following command the output is not printed:

$ udocker.py run $(udocker.py create debian:wheezy) bash -c 'echo hello'

 ****************************************************************************** 
 *                                                                            * 
 *               STARTING 42d55e4b-b5cb-3342-95ea-6e3ed93fcc64                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: bash

Add --kill-on-exit option to proot

--kill-on-exit of proot kills the tracee proot exists. It will avoid udocker to hang when a child process doesn't end. (It doesn't cover the case when a tracee is attached to init with nohup though, but work resonably well for child processes).

udocker pull fails with Error no files downloaded while docker succeeds

Hi,

udocker pull fails with Error no files downloaded while docker succeeds:

zoobab@filez /home/zoobab [2]$ udocker pull registry.access.redhat.com/rhel7
Error: no files downloaded
zoobab@filez /home/zoobab [3]$ docker pull registry.access.redhat.com/rhel7
Using default tag: latest
latest: Pulling from rhel7
154dc369ca0d: Pull complete
e6b5b6e3c142: Pull complete
Digest: sha256:822cfa544c7c51d8bca1675dfd7ef5b5aaa205e222617f787868516eca2c6acc
Status: Downloaded newer image for registry.access.redhat.com/rhel7:latest

Any idea why? Can you reproduce?

Quotes getting lost when mixing single and double quotes

this works:

λ  bin/udocker run python:2-slim python -c "print 'test'"

 ******************************************************************************
 *                                                                            *
 *               STARTING 9533b6b6-66da-3b11-94ab-95c1115751eb                *
 *                                                                            *
 ******************************************************************************
 executing: python
test

and this:

λ  bin/udocker run python:2-slim python -c "print \"test\""

 ******************************************************************************
 *                                                                            *
 *               STARTING 1c88d37d-2ce0-354e-91b5-8a2171050322                *
 *                                                                            *
 ******************************************************************************
 executing: python
test

but this does not work properly:

λ  bin/udocker run python:2-slim python -c "print \"test\" + 'test'"

 ******************************************************************************
 *                                                                            *
 *               STARTING 7473c26d-477a-3315-813e-5862779fbbe6                *
 *                                                                            *
 ******************************************************************************
 executing: python
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test' is not defined

parsing of command to run in container doesn't match Docker

Docker correctly handles complex quoting and redirection

$ docker run python:2-slim /bin/sh -c "echo '{"foo": {"location": "file:///"}}' > /dev/stdout"
{foo: {location: file:///}}
$

But udocker doesn't

$ udocker run python:2-slim /bin/sh -c "echo '{"foo": {"location": "file:///"}}' > /dev/stdout"
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING cce0587e-eeec-35ba-ba7f-eb936f9a846f                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: sh
{foo:
$

version command should exit 0

$ ./udocker version; echo Return code: $?
version: 1.1.1
tarball: https://owncloud.indigo-datacloud.eu/index.php/s/AFImjw8ii0X72xf/download https://cernbox.cern.ch/index.php/s/VC7GuVWA7mYRAiy/download http://repo.indigo-datacloud.eu/repository/indigo/2/centos7/x86_64/tgz/udocker-1.1.1.tar.gz
Return code: 1
$ docker version; echo Return code: $?
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:09:06 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:09:06 2017
 OS/Arch:      linux/amd64
 Experimental: false
Return code: 0

Cannot run udocker inside a container

I'm getting Error: do not run as root !, any chance this behaviour might be modified? :)

I want to use it in a container since some CI run steps inside containers, this is useful for running workflows:
docker run --rm --volume=$PWD:/tmp/workdir -w=/tmp/workdir me/cwltool-udocker cwltool --user-space-docker-cmd=udocker pack/pack.cwl pack/jobs/lab-mod.yml

workdir cannot be set to a volume directory

Executing this command raises an errror:

[reuillon:~/Documents/Recherche/Projects/gama-plugin] 7 1m35s 2 ± udocker run -v "/tmp":"/tmp/toto" --workdir=/tmp/toto ubuntu bash
Error: invalid working directory:  /tmp/toto

despite the folder being accessible in the container:

[reuillon:~/Documents/Recherche/Projects/gama-plugin] 7 4m2s ± udocker run -v "/tmp":"/tmp/toto" --workdir=/tmp/ ubuntu ls
 
 ****************************************************************************** 
 *                                                                            * 
 *               STARTING c7839a94-aa91-3256-8cd4-0fcf93fb617a                * 
 *                                                                            * 
 ****************************************************************************** 
 executing: ls
toto

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.