Giter Site home page Giter Site logo

skipper's Introduction

Skipper

Easily dockerize your Git repository

Build Status Release Status PyPI - Version

Introduction

Use Skipper to build & test your project in an isolated environment, using Docker containers with pre-defined sane configuration. Skipper allows you to execute makefile targets inside a container (or just run arbitrary commands). You can also use Skipper to build your development and production containers.

Installation

It is recommended to install Skipper directly from PyPi:

sudo pip install strato-skipper

You can also install Skipper from source:

git clone http://github.com/Stratoscale/skipper
sudo make install

Configure bash completion for skipper by sourcing the completion script in your ~/.bashrc file:

echo 'source <(skipper completion)' >>~/.bashrc

Python3 Environment

Skipper supports building and running in Python3 environment Set your locale to UTF-8:

export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"

Note for Linux Users with Docker

Running Skipper on Linux without sudo

If you are running Skipper on Linux without sudo, Skipper will create a dedicated user inside the build container with both root and docker groups. All commands will be executed on behalf of this user.

To preserve the environment, Skipper uses the su command with the -m flag. However, on Debian distros, the PATH variable may be reset even with the -m flag specified. To work around this issue, Skipper provides an alternative option using sudo -sE.

To use sudo -sE as an alternative:

  1. Install sudo in the build container.
  2. Disable env_reset with secure_path in the /etc/sudoers defaults.
  3. Set the SKIPPER_USE_SUDO environment variable to "true".
export SKIPPER_USE_SUDO="true"
# skipper.yaml

env:
    SKIPPER_USE_SUDO: "true"

Note: This information is crucial for a seamless experience when using Skipper with Docker on Linux.

Usage

Skipper can serve as your primary tool for your daily development tasks:

  • Use skipper build to build the images defined by the Dockerfiles in your repository. All the images will be automatically tagged with the COMMIT_ID.
  • Use skipper push to publish your images.
  • Use skipper images to list your images.
  • Use skipper rmi to delete your images.
  • Use skipper make to execute makefile targets inside a container.
  • Use skipper run to run arbitrary commands inside a container.
  • Use skipper shell to get an interactive shell inside a container.

Global Options

  -v, --verbose                 Increase verbosity
  --registry                    URL of the docker registry
  --build-container-image       Image to use as build container
  --build-container-tag         Tag of the build container
  --build-container-net         Network to connect the build container (default: net=host)
  --env-file                    Environment variables file/s to pass to the container
  --build-arg                   Set build-time variables for the container
  --build-context               Additional build contexts when running the build command, give them a name, and then access them inside a Dockerfile
  --help                        Show this message and exit.

Skipper allows you to add additional build contexts when running the build command, give them a name, and then access them inside a Dockerfile. The build context can be one of the following:

  • Local directory – e.g. --build-context project2=../path/to/project2/src
  • Git repository – e.g. --build-context qemu-src=https://github.com/qemu/qemu.git
  • HTTP URL to a tarball – e.g. --build-context src=https://example.org/releases/src.tar
  • Docker image – Define with a docker-image:// prefix, e.g. --build-context alpine=docker-image://alpine:3.15

On the Dockerfile side, you can reference the build context on all commands that accept the “from” parameter. Here’s how that might look:

FROM [name]
COPY --from=[name] ...
RUN --mount=from=[name] …

Build

As a convention, skipper infers the docker images from the Dockerfiles in the top directory of your repository. For example, assuming that there are 3 Dockerfile in the top directory of the repository:

Dockerfile.service1
Dockerfile.service2
Dockerfile.development

To build the image that corresponeds to Dockerfile.service1, run:

skipper build service1

In the same way you can build the image corresponded to Dockerfile.development:

skipper build development

You can also build mutliple images with single command:

skipper build development service2

A context path can be added to the build command, The build’s context is the files at a specified location PATH, the default is current directory:

skipper buid service1 --container-context /path/to/context/dir

If no image is specifed skipper will build all detected images:

skipper build

If you don't want to store all the Dockerfiles under the top directory of the project, you can specify the project's containers in skipper's config file (see below).

Push

Once you've built the images of your repositories as described above. You can publish them by pushing them to the registry. To push the service1 image, run:

skipper --registry some-registry push service1

Note that the registry in this command must be the same registry used while building the image.

Images

To list local images of your repository, run:

skipper images

In order to also list also images that were pushed to the registry, run:

skipper --registry some-registry images -r

Rmi

To delete an image of your repository, run:

skipper rmi service1 <tag>

In order to delete the image from the registry, run:

skipper --registry some-registry rmi -r service1 <tag>

Make

You can execute a Makefile target inside a container. This is good for keeping the development in an isolated environment, without installing development tools on the host. Once a development container is defined and built, it can be shared among the team member, assuring all of them use exactly thg same development environment. Assuming your project has a Makefile with a tests target, you can run:

skipper --registry some-registry --build-container-image development --build-container-tag latest \
make tests

If your Makefile is not standard (i.e. Makefile.arm32) you can pass it to the make command:

skipper --registry some-registry --build-container-image development --build-container-tag latest \
make -f Makefile.arm32 tests

Run

You can also run arbitrary commands inside your containers.

skipper --registry some-registry --build-container-image development --build-container-tag latest \
run gcc myprog.c -o myprog 

Shell

You can get a shell inside your containers.

skipper --registry some-registry --build-container-image development --build-container-tag latest \
shell

Configuration File

Skipper allows you to define commonly used parameters in a configuration file skipper.yaml at the top directory of your repositry.

registry: some-registry 
build-container-image: development
build-container-tag: latest
container-context: /path/to/context/dir

build-arg:
  - VAR1=value1
  - VAR2=value2

build-context:
  - context1=/path/to/context/dir # Local directory
  - qemu-src=https://github.com/qemu/qemu.git # Remote git repository
  - src=https://example.org/releases/src.tar # Remote tar file
  - alpine=docker-image://alpine:3.15 # Remote docker image

make: 
    makefile: Makefile.arm32
containers:
    service1: path/to/service1/dockerfile
    service2: path/to/service2/dockerfile
env:
    VAR: value
env_file: path/to/env_file.env
# Use the git revision as the build container tag
# Allows to use the same build container unless the git revision changes
# This is useful when using a CI system that caches the build container
# Remember to commit if you changing the build container
build-container-tag: 'git:revision'

Using the above configuration file, we now can run a simplified version of the make command described above:

skipper make tests

Published ports

For shell, run & make commands:
By default, when you run skipper on a linux machine it will use the host network and no mapping required.
For macos and windows machines where the host network is unsupported or for a custom network, you can publish a port and make it available to services outside of the container using the --publish or -p flag.

skipper make -p 123:123 tests
skipper make -p 123-130:123-130 tests

Environment variables

For shell, run & make commands: You can use -e in order to pass environment variables to the container.

skipper make -e regex=test1 tests

Your configuration file can contain environment variables, Skipper will set the specified environment variables in the container.

env:
    VAR: value

You can add an environment variables file (or multiple files) using --env-file. This file should use the syntax =value (which sets the variable to the given value) or (which takes the value from the local environment), and # for comments. The variables defined in this file will be exported to the container. Such file can look like this:

$ cat env_file.env
# This is a comment
KEY1=value1
KEY2=value2
KEY3    

Skipper configuration file can include the environment variables file:

env_file: 
    - /path/to/env_file1.env
    - /path/to/env_file2.env

Variable substitution

Skipper uses the variable values from the shell environment in which skipper is run. It’s possible to use environment variables in your shell to populate values For example, suppose the shell contains EXTERNAL_PORT=5000 and you supply this configuration:

env:
    EXTERNAL_PORT: $EXTERNAL_PORT

When you run Skipper command with this configuration, Skipper looks for the EXTERNAL_PORT environment variable in the shell and substitutes its value in.In this example, Skipper resolves the $EXTERNAL_PORT to "5000" and will set EXTERNAL_PORT=5000 environment in the container.

If an environment variable is not set, Skipper substitutes with an empty string.

Both $VARIABLE and ${VARIABLE} syntax are supported. Extended shell-style features, such as ${VARIABLE-default} and ${VARIABLE/foo/bar}, are not supported.

You can use a $$ (double-dollar sign) when your configuration needs a literal dollar sign. This also prevents Skipper from interpolating a value, so a $$ allows you to refer to environment variables that you don’t want processed by Skipper.

env:
    VAR: $$VAR_NOT_INTERPOLATED

Shell Interpolation

Skipper supports evaluating shell commands inside its configuration file using $(command) notation. e.g.

env:
    VAR: $(expr ${MY_NUMBER:-5} + 5)
volumes:
    - $(which myprogram):/myprogram

Volumes

Skipper can bind-mount a host directory into the container. you can add volumes in the configuration file:

volumes:
  - /tmp:/tmp:rw
  - ${HOME}/.netrc:/root/.netrc
  - ${HOME}/.gocache:/tmp/.gocache

Workdir

Skipper default to the the project directory as the working directory for the run, make and shell commands, you can override the workdir by specifying it in the configuration file:

workdir: /path/to/workdir

Workspace

Skipper default to the the project base directory (e.g. /path/to/project/../) as the workspace for the run, make and shell commands, Note that the workspace directory is mounted by default. you can override the workspace directory by specifying it in the configuration file

workdir: $PWD

Skipper environment variables

Skipper sets environemnt variables to inform the user about the underline system: CONTAINER_RUNTIME_COMMAND - The container conmmand used to run the skipper container. podman/docker

skipper's People

Contributors

adir-stratoscale avatar benkia avatar cben avatar dukloi-stratoscale avatar eifrach avatar eranco74 avatar iliafeldgun avatar jhernand avatar khizunov avatar michaelf-stratoscale avatar ofir-amir avatar omertuc avatar osherdp avatar posener avatar razregev avatar romang-stratoscale avatar romfreiman avatar spellr avatar tsorya avatar ygalblum avatar ygalblum-stratoscale avatar yuvigold 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

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

skipper's Issues

unable to install as non root account

when trying to install, I've seen the following:

pip install  strato-skipper --user                                                                                                                                                                                                                                                        git:(master|) 
Collecting strato-skipper
  Downloading https://files.pythonhosted.org/packages/96/37/12ad9a0b0d8c38408a0b53a581f1d3f0f912bae8dbb7e08ea3cdfcd29290/strato-skipper-1.19.1.tar.gz
Requirement already satisfied: PyYAML>=3.11 in /usr/lib64/python3.7/site-packages (from strato-skipper) (5.3.1)
Collecting click==6.7 (from strato-skipper)
  Downloading https://files.pythonhosted.org/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl (71kB)
     |████████████████████████████████| 71kB 734kB/s 
Requirement already satisfied: requests>=2.6.0 in /usr/lib/python3.7/site-packages (from strato-skipper) (2.22.0)
Collecting tabulate>=0.7.5 (from strato-skipper)
  Downloading https://files.pythonhosted.org/packages/c4/f4/770ae9385990f5a19a91431163d262182d3203662ea2b5739d0fcfc080f1/tabulate-0.8.7-py3-none-any.whl
Requirement already satisfied: six>=1.10.0 in /usr/lib/python3.7/site-packages (from strato-skipper) (1.12.0)
Requirement already satisfied: urllib3>=1.22 in /usr/lib/python3.7/site-packages (from strato-skipper) (1.25.7)
Collecting retry (from strato-skipper)
  Downloading https://files.pythonhosted.org/packages/4b/0d/53aea75710af4528a25ed6837d71d117602b01946b307a3912cb3cfcbcba/retry-0.9.2-py2.py3-none-any.whl
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/lib/python3.7/site-packages (from requests>=2.6.0->strato-skipper) (3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in /usr/lib/python3.7/site-packages (from requests>=2.6.0->strato-skipper) (2.8)
Collecting py<2.0.0,>=1.4.26 (from retry->strato-skipper)
  Downloading https://files.pythonhosted.org/packages/99/8d/21e1767c009211a62a8e3067280bfce76e89c9f876180308515942304d2d/py-1.8.1-py2.py3-none-any.whl (83kB)
     |████████████████████████████████| 92kB 338kB/s 
Requirement already satisfied: decorator>=3.4.2 in /usr/lib/python3.7/site-packages (from retry->strato-skipper) (4.4.0)
Installing collected packages: click, tabulate, py, retry, strato-skipper
  Running setup.py install for strato-skipper ... error
    ERROR: Complete output from command /usr/bin/python3 -u -c 'import setuptools, tokenize;__file__='"'"'/tmp/pip-install-klfx9zq3/strato-skipper/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-p8wglbxq/install-record.txt --single-version-externally-managed --compile --user --prefix=:
    ERROR: running install
    [pbr] Generating AUTHORS
    [pbr] AUTHORS complete (0.0s)
    running build
    running build_py
    creating build
    creating build/lib
    creating build/lib/skipper
    copying skipper/cli.py -> build/lib/skipper
    copying skipper/__init__.py -> build/lib/skipper
    copying skipper/git.py -> build/lib/skipper
    copying skipper/main.py -> build/lib/skipper
    copying skipper/utils.py -> build/lib/skipper
    copying skipper/config.py -> build/lib/skipper
    copying skipper/runner.py -> build/lib/skipper
    running egg_info
    writing strato_skipper.egg-info/PKG-INFO
    writing dependency_links to strato_skipper.egg-info/dependency_links.txt
    writing entry points to strato_skipper.egg-info/entry_points.txt
    writing requirements to strato_skipper.egg-info/requires.txt
    writing top-level names to strato_skipper.egg-info/top_level.txt
    [pbr] Reusing existing SOURCES.txt
    running install_lib
    creating /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/runner.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/config.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/utils.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/main.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/git.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/__init__.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    copying build/lib/skipper/cli.py -> /home/ohad/.local/lib/python3.7/site-packages/skipper
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/runner.py to runner.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/config.py to config.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/utils.py to utils.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/main.py to main.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/git.py to git.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/__init__.py to __init__.cpython-37.pyc
    byte-compiling /home/ohad/.local/lib/python3.7/site-packages/skipper/cli.py to cli.cpython-37.pyc
    running install_data
    copying data/skipper-complete.sh -> /etc/bash_completion.d
    error: could not create '/etc/bash_completion.d/skipper-complete.sh': Permission denied
    ----------------------------------------
ERROR: Command "/usr/bin/python3 -u -c 'import setuptools, tokenize;__file__='"'"'/tmp/pip-install-klfx9zq3/strato-skipper/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-p8wglbxq/install-record.txt --single-version-externally-managed --compile --user --prefix=" failed with error code 1 in /tmp/pip-install-klfx9zq3/strato-skipper/

it would be nice to detect if its running as root or not, and create the file in the correct place, e.g. ~/.bash_completion

Skipper is looking for docker group name, which breaks for macOS

Traceback (most recent call last):
  File "/usr/local/bin/skipper", line 10, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/skipper/main.py", line 16, in main
    standalone_mode=False
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/skipper/cli.py", line 255, in make
    workspace=ctx.obj.get('workspace'))
  File "/usr/local/lib/python3.7/site-packages/skipper/runner.py", line 17, in run
    workdir, use_cache, workspace)
  File "/usr/local/lib/python3.7/site-packages/skipper/runner.py", line 67, in _run_nested
    docker_gid = grp.getgrnam('docker').gr_gid
KeyError: "getgrnam(): name not found: 'docker'"

Skipper installation shows error messages

sudo pip install -U 'strato-skipper==1.1.2'
[sudo] password for shay: 
Collecting strato-skipper==1.1.2
  Downloading strato-skipper-1.1.2.tar.gz
Requirement already up-to-date: PyYAML>=3.11 in /usr/lib64/python2.7/site-packages (from strato-skipper==1.1.2)
Requirement already up-to-date: click>=6.6 in /usr/lib/python2.7/site-packages (from strato-skipper==1.1.2)
Requirement already up-to-date: requests>=2.6.0 in /usr/lib/python2.7/site-packages (from strato-skipper==1.1.2)
Requirement already up-to-date: tabulate>=0.7.5 in /usr/lib/python2.7/site-packages (from strato-skipper==1.1.2)
Building wheels for collected packages: strato-skipper
  Running setup.py bdist_wheel for strato-skipper ... error
  Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-mQDhdc/strato-skipper/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /tmp/tmpitcZL5pip-wheel- --python-tag cp27:
  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "/tmp/pip-build-mQDhdc/strato-skipper/setup.py", line 9, in <module>
      raise RuntimeError("This setup.py does not support wheels")
  RuntimeError: This setup.py does not support wheels

  ----------------------------------------
  Failed building wheel for strato-skipper
  Running setup.py clean for strato-skipper
Failed to build strato-skipper
Installing collected packages: strato-skipper
  Found existing installation: strato-skipper 1.1.2.dev4
    Uninstalling strato-skipper-1.1.2.dev4:
      Successfully uninstalled strato-skipper-1.1.2.dev4
  Running setup.py install for strato-skipper ... done
Successfully installed strato-skipper-1.1.2

Mapping podman socket to the skipper container

The new podman supports mapping podman-sockets to containers and works like Docker.
Currently, it can be implemented manually by mapping the socket as any other volume.
It should be treated as a first-class citizen

Host group id differs from the docker group id

causing this issue

[skipper] No build container tag was provided. Building from scratch...
rm -rf dist reports *.egg-info build logs .eggs
find kubernetes_manager tests -name "*.pyc" -delete
rm -rf kubernetes-client/kubernetes_client/client.py kubernetes-client/dist kubernetes-client/*.egg-info
docker-compose kill
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

Fails to tag skipper build in git subdir

=> => naming to docker.io/library/jenkins-tools:none

[ilia@fedora jenkins-tools]$ skipper build jenkins-tools
WARNING:root:*** Not working in a git repository ***
[skipper] Building image: jenkins-tools
INFO:skipper:Building image: jenkins-tools
[+] Building 0.1s (12/12) FINISHED                                                                                        docker:default
 => [internal] load build definition from Dockerfile.jenkins-tools                                                                  0.0s
 => => transferring dockerfile: 503B                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                   0.0s
 => => transferring context: 2B                                                                                                     0.0s
 => [internal] load metadata for rackattack-nas.dc1:5000/python:3.10.12-slim-buster                                                 0.0s
 => [1/7] FROM rackattack-nas.dc1:5000/python:3.10.12-slim-buster                                                                   0.0s
 => [internal] load build context                                                                                                   0.0s
 => => transferring context: 313B                                                                                                   0.0s
 => CACHED [2/7] COPY requirements.txt /tmp/requirements.txt                                                                        0.0s
 => CACHED [3/7] RUN python -m pip install -r /tmp/requirements.txt                                                                 0.0s
 => CACHED [4/7] COPY dist/zadara_jenkins_tools-*.whl /tmp/                                                                         0.0s
 => CACHED [5/7] RUN python -m pip install /tmp/zadara_jenkins_tools-*.whl                                                          0.0s
 => CACHED [6/7] RUN echo $(eval "$(_FOO_BAR_COMPLETE=bash_source job-aligner)") >> ~/.bashrc                                       0.0s
 => CACHED [7/7] RUN rm -rf /tmp/zadara_jenkins_tools.whl /tmp/requirements.txt                                                     0.0s
 => exporting to image                                                                                                              0.0s
 => => exporting layers                                                                                                             0.0s
 => => writing image sha256:18f558fa752599d1c818f36ab6c8cef756a368d857a4ff7d91a4e1ef3bedb961                                        0.0s
 => => naming to docker.io/library/jenkins-tools:none                                                                               0.0s
[ilia@fedora jenkins-tools]$ git rev-parse HEAD
f2d5912a56a79ae31664c722212a9a4b1181c15f
[ilia@fedora jenkins-tools]$ 

Skipper on macOS: permission issue

How to reproduce (on macOS):

skipper make generate-from-swagger

The error I get:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/opt/skipper/skipper-entrypoint.sh\": permission denied": unknown.

The full log:

[skipper] No build container tag was provided
[skipper] Building image using docker file: Dockerfile.assisted-service-build
Sending build context to Docker daemon  210.8MB
Step 1/8 : FROM quay.io/app-sre/golang:1.14.3
 ---> 7e5e8028e8ec
Step 2/8 : ENV GO111MODULE=on
 ---> Using cache
 ---> 4c4fd3cb9a1a
Step 3/8 : RUN apt-get update && apt-get install -y docker.io libvirt-clients awscli python3-pip postgresql  && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> fb401dce6731
Step 4/8 : RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.24.0
 ---> Using cache
 ---> 3c380c14f0a3
Step 5/8 : RUN go get -u github.com/onsi/ginkgo/[email protected]               golang.org/x/tools/cmd/[email protected]               github.com/golang/mock/[email protected]               github.com/vektra/mockery/.../@v1.1.2               gotest.tools/[email protected]               github.com/axw/gocov/gocov               github.com/AlekSi/[email protected]
 ---> Using cache
 ---> 8ef85f123b4e
Step 6/8 : RUN pip3 install boto3==1.13.14 waiting==1.4.1 requests==2.22.0 mkdocs==1.1.2
 ---> Using cache
 ---> 14dd80b7d245
Step 7/8 : RUN curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.10.1/minikube-linux-amd64   && chmod +x minikube && mkdir -p /usr/local/bin/ && install minikube /usr/local/bin/
 ---> Using cache
 ---> dbe92f2d1c6a
Step 8/8 : RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
 ---> Using cache
 ---> 27734d8c463a
Successfully built 27734d8c463a
Successfully tagged assisted-service-build:latest
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/opt/skipper/skipper-entrypoint.sh\": permission denied": unknown.

can't build skipper (skipper build cmd) with v2.0.0 and v2.0.1

See $TOPIC.

I get:

skipper build

WARNING:root:*** Uncommitted changes present - Build container version might be outdated ***
[skipper] Building image: assisted-service-build
INFO:skipper:Building image: assisted-service-build
Traceback (most recent call last):
  File "/usr/local/bin/skipper", line 10, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/skipper/main.py", line 12, in main
    return_code = cli.cli(
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/skipper/cli.py", line 117, in build
    fqdn_image = image + ':' + tag
TypeError: can only concatenate str (not "bytes") to str

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.