簡體   English   中英

在 docker-compose 中運行容器時使用當前用戶

[英]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”用戶名存在;

讓我的用戶名在容器內可用:一個 docker 技巧

我假設您沒有在容器內創建用戶。 例如,我將使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM