我寫了一個需要讀取一些變數的 Docker 映像,所以我寫在Dockerfile:
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
ENV USER=laravel
RUN useradd -G www-data,root -u $UID -d /home/$USER $USER
RUN mkdir -p /home/$USER/.composer && \
chown -R $USER:$USER /home/$USER
這段代碼實際上允許我創建一個laravel用戶,該用戶具有啟動容器的用戶的 id。
因此,拉取此影像的用戶實際上在該docker-compose部分中設定了此內容:
env_file: .env
其中有:
GROUP_ID=1001
USER_ID=1001
由于一些我不明白的奇怪原因,當我在帶有拉取影像的容器中執行時,用戶laravel被映射到 id 1000,這是Dockerfile.
相反,如果我使用以下方法測驗影像:
build:
context: ./docker/php
dockerfile: ./Dockerfile
args:
- UID=${GROUP_ID:-1000}
- GID=${USER_ID:-1000}
我可以正確看到用戶laravel映射為1001. 所以問題如下:
- UID 變數不是從 env 檔案中讀取的嗎?
- 默認值會覆寫 env 值嗎?
提前感謝您的幫助
更新:
正如建議的那樣,我嘗試在入口點執行的 bash 腳本中更改用戶 ID 和組 ID,在Dockerfile我有這個:
ENTRYPOINT ["start.sh"]
然后,在開始時start.sh我添加了:
usermod -u ${USER_ID} laravel
groupmod -g ${GROUP_ID} laravel
現在的問題是:
usermod:用戶 laravel 當前被行程 1 使用 groupmod:權限被拒絕。groupmod:無法鎖定 /etc/group;稍后再試。
uj5u.com熱心網友回復:
Dockerbuild phase和Dockerrun phase是這里的關鍵時刻。添加了新用戶build phase,因此在構建 docker 映像時傳遞build phase動態值很重要,例如
docker build --build-arg UID=1001 --build-arg GID=1001 .
或者您已經使用過的情況以及它在哪里作業(即使用預期的 ID 重新創建 docker 映像),在docker-compose檔案中:
build:
context: ./docker/php
dockerfile: ./Dockerfile
args:
- UID=${GROUP_ID:-1000}
- GID=${USER_ID:-1000}
在run phase中,即啟動已經構建好的 docker 鏡像的容器實體,傳遞env不會覆寫build phase. 因此,在您的情況下,您可以在啟動容器時省略傳遞 envs。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524141.html
