jee*_*327 30 docker docker-compose
有没有办法以当前用户身份执行或登录bash of specific container. 我尝试运行,docker-compose exec -u $USER phoenix bash但它说无法找到用户 raz: passwd 文件中没有匹配的条目
我尝试了另一种方法,在 dockerfile 中添加 useradd 命令。
FROM elixir:latest
ARG USER_ID
ARG GROUP_ID
RUN addgroup --gid $GROUP_ID raz
RUN adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID raz
USER raz
RUN apt-get update && \
apt-get install -y postgresql-client && \
apt-get install -y inotify-tools && \
apt-get install -y nodejs && \
curl -L https://npmjs.org/install.sh | sh && \
mix local.hex --force && \
mix archive.install hex phx_new 1.5.3 --force && \
mix local.rebar --force
COPY . /app
WORKDIR /app
COPY ./entrypoint.sh /entrypoint.sh
RUN ["chmod", "+x", "/entrypoint.sh"]
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
但是当我docker-compose build运行 apt-get 命令时出现权限被拒绝错误。我也寻找gosu降级 root 用户,但这似乎很复杂。
Dockerfile 命令中添加的用户是否可以具有与当前用户相同的权限?顺便说一句,我正在运行 WSL2。
Mak*_*isH 35
以 Joepreludian 的答案为基础,重点关注 docker-compose:
您可以在撰写文件中使用user:和选项。volumes:例如:
my-service:
image: ubuntu:latest
user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
Run Code Online (Sandbox Code Playgroud)
并在开始撰写时定义这些变量:
MY_UID="$(id -u)" MY_GID="$(id -g)" docker-compose up
Run Code Online (Sandbox Code Playgroud)
小智 33
这个问题很有趣。让我先做一个简短的解释:
事实上,容器内存在的用户仅在容器本身内有效。您想要做的是使用容器外部存在的用户,即容器内部的 docker 主机。不幸的是,这个动作不能以正常方式完成。
例如,让我尝试更改为我的用户以获得此容器:
$ docker run -it --rm --user jon ubuntu whoami
docker: Error response from daemon: unable to find user jon: no matching entries in passwd file.
Run Code Online (Sandbox Code Playgroud)
我尝试在我的 docker 主机中运行一个经典的 ubuntu 容器;尽管该用户存在于我的本地计算机上,但 Docker 映像表示未找到该用户。
$ id -a
uid=1000(jon) gid=1001(jon) groups=1001(jon),3(sys),90(network),98(power),108(vboxusers),962(docker),991(lp),998(wheel),1000(autologin)
Run Code Online (Sandbox Code Playgroud)
上面的命令在我的电脑上执行,证明“jon”用户名存在。
我想您没有在容器内创建用户。为了进行演示,我将使用 ubuntu docker 映像。
诀窍是在容器内安装负责处理用户和组定义的两个文件,使容器能够在其中看到您。
$ docker run -it --rm --volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro --user $(id -u) ubuntu whoami
jon
Run Code Online (Sandbox Code Playgroud)
更完整的例子:
$ docker run -it --rm --volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro --user $(id -u):$(id -g) ubuntu "id"
uid=1000(jon) gid=1001(jon) groups=1001(jon)
Run Code Online (Sandbox Code Playgroud)
请注意,我使用了指向两个文件的两个卷?/etc/password 和 /etc/group?为了安全起见,我将两者都安装为只读(附加“:ro”)。
另请注意,我使用了id -u,它为我带来了用户 ID(在我的情况下为 1000),强制用户 ID 与我在文件中定义的用户 ID 相同/etc/password。
如果您尝试将用户名设置为jon而不是 UID,您将遇到问题:
$ docker run -it --rm --volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro --user jon ubuntu whoami
docker: Error response from daemon: unable to find user jon: no matching entries in passwd file.
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为 docker 引擎会在安装卷之前尝试更改用户名,并且在运行容器之前应该存在该用户名。如果您提供用户的数字表示形式,则该表示形式不需要存在于容器内,从而使该技巧起作用;
https://docs.docker.com/engine/reference/run/#user
我希望能有所帮助。注意安全!
| 归档时间: |
|
| 查看次数: |
40032 次 |
| 最近记录: |