[英]Using current user when running container in docker-compose
有沒有辦法以當前用戶身份執行或登錄到bash of specific container
。 我嘗試運行docker-compose exec -u $USER phoenix bash
但它說無法找到用戶 raz:密碼文件中沒有匹配條目
我通過在 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"]
但是當我運行docker-compose build
時,我在運行 apt-get 命令時遇到權限被拒絕的錯誤。 我也在尋找gosu
作為根用戶的降級,但它看起來很復雜。
在 Dockerfile 命令中添加的用戶是否有可能與我當前用戶具有相同的權限? 順便說一句,我正在運行 WSL2。
以 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
並在您開始撰寫的地方定義這些變量:
MY_UID="$(id -u)" MY_GID="$(id -g)" docker-compose up
這個問題挺有意思的。 讓我先做一個簡短的解釋;
實際上,存在於容器內的用戶僅在容器本身內有效。 您想要做的是使用存在於容器外部的用戶,也就是您的 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.
我試圖在我的 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)
上面的命令是在我的電腦上執行的,證明“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
一個更完整的例子:
$ 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)
請注意,我使用了兩個指向兩個文件的卷? /etc/password 和 /etc/group? 為了安全起見,我只安裝了只讀(附加“:ro”)。
另請注意,我使用了id -u
,它為我帶來了用戶 ID(在我的情況下為 1000),強制用戶 ID 與我在/etc/password
文件中定義的用戶 ID 相同。
如果您嘗試將用戶名設置為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.
發生這種情況是因為 docker 引擎會在安裝卷之前嘗試更改用戶名,這應該在運行容器之前存在。 如果您提供用戶的數字表示,則該用戶不需要存在於容器中,從而使技巧起作用;
https://docs.docker.com/engine/reference/run/#user
我希望有幫助。 注意安全!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.