-
Notifications
You must be signed in to change notification settings - Fork 5.2k
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
Variable substitution #2380
Comments
👍 I have the exact same problem, as soon as I saw variable substitutio I tried for I could make the file ownership issues of containers mounting code folders go away. Please please please enable shellvars along with envvars to be sunstituted on docker-compose.yml files. Thank you for the excellent work. |
The only different is that I would suggest |
👍 I think this is a common use-case when mouting directories from the host and accessing them inside the container. Having to export extra environment variables on the host side is unnecessary extra configuration on the host side which more or less defeats this whole purpose. |
+1 Another use case would be trying to set the hostname of a container to the hostname of your host: myapp:
hostname: ${HOSTNAME} My workaround right now is to set it before calling docker-compose
|
I have exactly the same problem. In our team all you need to do to setup a new developer is
We need the same user on the container and the host because of the big amount of Ruby on Rails commands that generate new files on the project volume. The sad part is that you have to export the This problem is specific to programmers using docker-compose as a tool: Using docker CLI directly you don't have this problem because it is assumed that you run them within a shell and there you can use the variable Using docker through the API is also possible getting the current user id with When using docker-compose i haven't find the way of doing it without running commands, so the "same user as the host" service requirement can't be made effective on any of the repository files. A solution may be to setup some specific environment variable (let's say COMPOSE_UID) to the same UID as the user running the docker-compose command with |
👍 |
Can't spam enough 👍 for this. UID/GID of the current host process should be provided by docker-compose in some way. |
So as my #4725 got closed due to duplicates I need to ask the remaining question here: How to solve/bypass this? I guess it can't be left that way it is as long as there is no alternative. Does the world build a wrapper around docker-compose having |
I'm also going to add my voice to this. Developing with Django from within a container and would love for this to work out of the box without having to export UID and GID. I personally am not concerned how it is done, but a way for files written to the mounted volume in the container to match the host user without having to export UID and GID is my end aim. Currently running the export isn't a big deal, it would just be nicer if this wasn't the case |
To be honest we sort of worked around this issue by doing something similar to:
Only drawback: UID conflicts with images that by default use the same one with any local user. (i.e. official node images have node user with UID=1000 and that conflicts with the initial UID a typical Ubuntu desktop assigns to its first user, tha one you're going to use post-installation) |
Just use a static user like |
That is true if you use an image from a Dockerfile. Not true if you just want to start a node app by pulling the default image without any fiddling around or any custom shell script as your command. |
@sokratisg You seem to use a local Dockerfile already, replacing |
@edannenberg excuse me but I think I may have been misunderstood, maybe my comment wasn't very clear. I'll try to give you an example. Let's say your desktop user has UID=1000 (default for first user, at least on Ubuntu) and that you've written a node app that outputs or generates some local files. You want them to be written with the correct ownership (UID=1000) since you're also working locally and want to have read/write access on them without using sudo for your favorite editor/IDE. If you go with the solution I described then upon startup of the node container you will end up with a UiD conflict since official node images come pre-baked with a node user that has the same UID (1000). This is what I was trying to describe; that this workaround is not universal and comes with some possibilities of a conflict so this issue is still relevant. |
@sokratisg I got that, the problem is that your solution tries to add another user with an already existing UID. My point was that you can avoid that by just changing the UID of an existing static user in the image, i.e. A typical nodejs compose file in our projects looks like this:
The |
My workaround for the usecase of ownership of mounted volumes is to use a impersonate.sh script as the entrypoint of the image, like this:
|
+1 |
Django Developer here: |
One better and more versatile would be the ability to include shell script in the docker-compose. Something like this would be helpful
I'm currently accomplishing this by wrapping the Edit: A lot of the comments are saying to just use $UID and $GID. I don't know about other distros but my Ubuntu Server 16.4 doesn't have that by default so adding the following to your
|
I use something like this: version: "2.1"
services:
app:
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
user: $UID:$GID |
Using a .env file ; sadly, you can't use substitutions in a .env file, it's all literals. |
Maybe I've got the wrong idea here, but why do folks use the user and group ID of the current user when they run their services? So far, I've personally been creating system users in Ubuntu for this, one per service. So for my I have a shell script I run right now to launch my services with users in this way, but unfortunately since I can't run subshells inside the
Is this not the recommended way to run permissions for containers? I'd rather not start them under my personal account I use to SSH into the machine itself, since this user account was not meant to be used by services running 24/7. Assuming what I'm doing isn't completely bonkers, then I think there's still some ways to go before I use docker compose. Right now I use a series of bash scripts to start my services, semantically similar to |
Largely in a development context, in cases where it is desirable to use bind-mounts, and you can't, or it's not easy or practical to prevent the container from creating files. If such files are created with users/groups that don't match the host-container, they become painful to clean-up in development-cycles. |
@gponsu We're using environment variable which is documented in our
and then in
The But yeah, I came here because I was looking for executing Bash script in |
looking for better solution |
Working for me.
and run docker-compose with export like this
|
Just ran into a scenario where I needed to pass the UID an GID to compose. I'll just live what I did here so maybe it helps someone out there. I'm running Mint (Ubuntu based distro) and here is the step by step that got this working for me:
export COMPOSE_UID=$(id -u)
export COMPOSE_GID=$(id -g)
version: "3"
services:
storage:
image: richarvey/nginx-php-fpm:latest
volumes:
- .:/var/www/html
environment:
WEBROOT: /var/www/html/www
PUID: ${COMPOSE_UID}
PGID: ${COMPOSE_GID}
ports:
- 8081:80
$ docker-compose up |
When using sudo to launch docker-compose, one can use the SUDO_UID and SUDO_GID environment variables which contain respectively the UID and GID of the user who launched the command: version: '3'
services:
php-apache:
build:
context: ./php-apache
args:
APACHE_UID: "${SUDO_UID}"
ports:
- 8080:80
volumes:
- ./DocumentRoot:/var/www/html:z |
Use an
|
After hours of searching, @slykar came with the missing piece. Finally I've got it working. Small addition: Why not add the
|
The difficulty is that
They're inserted magically by your shell. I've used the version: '2'
services:
hello_world:
image: ubuntu
command: [/bin/echo, 'Hello, user : ${UID} in group ${GID}']
If you add the
I usually do this with a shell script. (e.g. What would be nice is if |
As @Wirone signaled, it's possible to work around this issue pretty well by using:
But indeed it would be practical to have Compose either let us do a |
For people who are looking for a solution in the current version of docker-compose.Default linux user have So i found very practical to substitute these values as default in docker-compose to simplify usage of docker-compose CLI. user: "${UID:-1000}:${GID:-1000}" If developer needs some custom values of user id and group id or he needs full control over execution in automating tools so he can pass manually any values of
|
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
This issue has been automatically closed because it had not recent activity during the stale period. |
I did a PR to add possibility to use variables without external calls like Please vote compose-spec/compose-go#299 |
who would win? millions in funding, nine years of development time, hundreds of bumps across multiple issues, a dozen thoughtfully crafted suggestions vs. two shell variables |
This new feature is amazing, but I had a problem. I explain:
In our dev team, to enter in docker with a user with the same UID and GID that of the host machine, we made the following:
The
docker-custom.yml
file we have untracked of git, so everyone can define their own settings.With the new functionality of
Variable substitution
, I was excited, because we could spare us all this, and minimize it to this line in docker-compose.yml:Unfortunately this does not work, because UID and GID are shell variables (not env variables), and
os.environ
do not get them.Would it be possible get the shell envs too? Something like (I know nothing about python 😞):
He had also thought of another possibility, if the option
user
isuser: host
or similar, internally get the uid and gid with:And setup docker with this config for user.
Thank you very much for everything, and apologies for my horrible English.
The text was updated successfully, but these errors were encountered: