Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow setting file owner/permission after artifact is downloaded #2625

Open
shantanugadgil opened this issue May 8, 2017 · 18 comments
Open
Labels
hcc/sme Admin - internal stage/accepted Confirmed, and intend to work on. No timeline committment though. theme/artifact type/enhancement

Comments

@shantanugadgil
Copy link
Contributor

Nomad version

Nomad v0.5.6

Operating system and Environment details

CentOS 7/Ubuntu 16.04

Issue

Using this as reference:
https://www.nomadproject.io/docs/job-specification/artifact.html
I also tried: https://github.com/hashicorp/go-getter

How can I set file permissions to the downloaded artifact?
For security reason, I would like to set 0600 on the downloaded artifact file, before my application can use it.

I hope I am missing some simple configuration option for the artifact 🙁

As an extension, is it possible to set ownership on the downloaded file.
I don't need owner settings immediately, though it could come in handy later (I think)

Thanks and Regards,
Shantanu

@dadgar
Copy link
Contributor

dadgar commented May 8, 2017

@shantanugadgil No there currently isn't. I have file an issue for go-getter to add support for that. When that comes we can add it to the job file.

For now you will have to wrap your task in a script that sets the permissions and then runs the app.

@shantanugadgil
Copy link
Contributor Author

@dadgar any updates on this?

Regards,
Shantanu

@rafaelpirolla
Copy link

I had an issue trying to run tomcat inside a java driver job. As the downloaded war was inside /local/apps tomcat couldn't deploy it. I have made /local the directory and it now works but it would be great to be able to set ownership and permissions. Will follow up on the go-getter issue.

@shantanugadgil
Copy link
Contributor Author

Any chance of this making into 0.9.0 ?

@dradtke
Copy link

dradtke commented Mar 5, 2019

For anyone else waiting on a proper fix here, my current workaround is to execute bash directly and pass it a script that sets the executable bit first:

config {
    command = "bash"
    args = ["-c", "chmod +x local/app && exec local/app"]
}

@shantanugadgil
Copy link
Contributor Author

Nowadays what I do is put all the "shell logic" inside a script and just execute that script as the command.
Usually the last line of the script is the actual app to run! 😄

@ccakes
Copy link

ccakes commented Jun 12, 2019

I used the method suggested by @dradtke which worked fine until I upgraded to Nomad 0.9.2 yesterday and now I'm getting these in the stderr log.

chmod: changing permissions of 'local/my-bin': Operation not permitted

EDIT: I guess this is related to #5728 - using an artifact {} stanza to place the file leaves it owned by root:root so then during the job execution, nobody isn't able to chmod the file.

The nicest solution for this is for the artifact {} stanza to set permissions however a hacky solution is to cp the binary so it's owned by nobody, then chmod that...

@langmartin
Copy link
Contributor

Another workaround for permissions is to package the file in a tar or zip archive with the correct permissions, and then to use the files in /local. Permissions are preserved when decompressing.

@danlsgiga
Copy link
Contributor

yup, hit the same wall here. .tar.gz file is decompressed and all the files permissions are set to root.

@tgross tgross added this to the unscheduled milestone Mar 4, 2020
@shantanugadgil
Copy link
Contributor Author

The milestone changed to unscheduled 😢 ???

I know permissions do not make sense for 'all extracted file of an archive',
but at least make this possible for single file downloads.
For example if I am downloading a binary, I have to ensure that its executable.

If not, how about adding an example of a template block in the docs of the artifact stanza, for anyone looking for the word "perm" and/or "owner"

@tgross
Copy link
Member

tgross commented Mar 13, 2020

The milestone changed to unscheduled

No worries, that just means we don't have a specific release to slot this into yet, not that we're never going to tackle it.

@raypettersen
Copy link

We just hit this also.

@HarryHarcourt
Copy link

Frustratingly, also just hit this issue, file permissions not retained after decompression, I am not sure how the "exec" driver would ever be useful without the right permissions (especially as it defaults to "nobody")

@pdumon
Copy link

pdumon commented Jun 24, 2020

Same here. tarball doesn't solve: permissions are still set to root also after decompressing.

@shantanugadgil
Copy link
Contributor Author

combined with the artifact stanza to download the tarball, I typically use the following boiler plate job script.

This allows me to then execute any chmod/chown commands as I please. 😄

job "sample" {
  datacenters = ["dc1"]

  type = "batch"

  group "sample" {
  
    task "sample" {
	
      driver = "raw_exec"

      template {
        data = <<EOH
#!/bin/bash

set -u

id -a

hostname

env | sort

sleep 30
EOH

        destination = "local/runme.bash"
      }

      config {
        command = "/bin/bash"
        args    = ["-x", "local/runme.bash"]
      }
    }
  }
}

HTH.

@pdumon
Copy link

pdumon commented Jun 26, 2020

We're using the qemu driver and artifact to specify the VM image. If I wrap the qemu commands into a raw_exec task, then I also use port_map and so forth... Tried to look into the go-getter code to see where things are going wrong but couldn't really find.

@aflatter
Copy link

aflatter commented Jul 9, 2020

Hmmm, same here. As a work-around, I prevent artifact from extracting the archive (using archive = false) and use a template to create a small wrapper bash script that extracts the archive and then runs the application.

config {
  command = "/bin/bash"
  args = ["run.sh", "--my", "--real=args"]
}

template {
  data = <<EOH
    #!/usr/bin/env bash

    cd local
    tar xzf ./release.tar.gz
    bin/myapp "$@"
  EOH

  destination = "run.sh"
  perms = "755"
}

But that's still a lot of ceremony for something really simple. I expected the artifact stanza to extract my tar archive using the same user that the task uses to run. Would that work?

@tgross tgross added the stage/accepted Confirmed, and intend to work on. No timeline committment though. label Aug 24, 2020
@joshua-bradley joshua-bradley added the hcc/sme Admin - internal label Sep 28, 2020
@picatz
Copy link
Contributor

picatz commented Jan 21, 2021

Ran into this today while trying to create a simple Prometheus + Grafana jobspec using the exec task driver:

job "metrics" {
  datacenters = ["dc1"]
  group "prometheus_and_grafana" {
    task "prometheus" {
      driver = "exec"
      config {
        command = "./local/prometheus-2.23.0.linux-amd64/prometheus"
        args    = ["--config.file", "local/prometheus-2.23.0.linux-amd64/prometheus.yml"]
      }
      artifact {
        source = "https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz"
      }
    }
    task "grafana" {
      driver = "exec"
      config {
        command = "./local/grafana-7.0.0/bin/grafana-server"
        args    = ["-homepath", "local/grafana-7.0.0"]
      }
      artifact {
        source = "https://dl.grafana.com/oss/release/grafana-7.0.0.linux-amd64.tar.gz"
      }
    }
  }
}

Errors for the grafana task:

Failed to start grafana. error: failed to create log directory "local/grafana-7.0.0/data/log": mkdir local/grafana-7.0.0/data: permission denied

Going to try to use the mentioned workaround using a template wrapper from above.

@tgross tgross added this to Needs Roadmapping in Nomad - Community Issues Triage Feb 12, 2021
@tgross tgross removed this from the unscheduled milestone Feb 12, 2021
@tgross tgross removed this from Needs Roadmapping in Nomad - Community Issues Triage Mar 4, 2021
@tgross tgross changed the title [question] howto set file owner/permission after artifact is downloaded? allow setting file owner/permission after artifact is downloaded Jul 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
hcc/sme Admin - internal stage/accepted Confirmed, and intend to work on. No timeline committment though. theme/artifact type/enhancement
Projects
None yet
Development

No branches or pull requests