web-dev-qa-db-ja.com

DockerfileはホストユーザーのUIDとGIDをイメージに複製します

SOのホストからのコンテナ内のUID/GIDの複製に関する投稿 に似ていますが、複製UIDとGIDを持つユーザーでどのようにイメージを構築しますか?できれば、dockerfileでどのように行うのですか?

私はbashスクリプトでそれを行うことができます:

#!/bin/bash

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF1 > bb.dockerfile
 FROM ubuntu:xenial-20170214
 ARG UNAME=testuser
EOF1

 echo ARG UID=${curr_uid} >> bb.dockerfile
 echo ARG GID=${curr_gid} >> bb.dockerfile

cat << EOF2 >> bb.dockerfile
 RUN groupadd -g \$GID \$UNAME
 RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
 USER \$UNAME
 CMD /bin/bash
EOF2

docker build -f bb.dockerfile -t testimg .

このbashは、次のようにdockerファイルを生成し、その上にビルドします。

 FROM ubuntu:xenial-20170214
 ARG UNAME=testuser
 ARG UID=1982
 ARG GID=1982
 RUN groupadd -g $GID $UNAME
 RUN useradd -m -u $UID -g $GID -s /bin/bash $UNAME
 USER $UNAME
 CMD /bin/bash

私が求めているのは、ハードコードされたホストUID 1982とGID 1982をdockerfileから削除することです。

17
minghua

ビルド引数として渡すことができます。 Dockerfileは静的にすることができます。

FROM ubuntu:xenial-20170214
ARG UNAME=testuser
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID -o $UNAME
RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
USER $UNAME
CMD /bin/bash

次に、ビルドコマンドでオプションを渡します。

docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) \
  -f bb.dockerfile -t testimg .

ホストボリュームマウントのファイル/ディレクトリ許可を検索するルートとしてエントリポイントを実行し、コンテナ内のユーザーのuid/gidをボリュームuidに一致するように調整することで、これとは異なる方法で同様の問題を解決したことに注意してください/ gid。その変更を行った後、ルートユーザーから変更されたuid/gidユーザーへのアクセスをドロップし、元のコマンド/エントリポイントを実行します。その結果、イメージはどの開発マシンでも変更なしで実行できます。この例は、私のjenkins-dockerリポジトリにあります。

https://github.com/Sudo-bmitch/jenkins-docker

32
BMitch

最終的にbb.bashは次のようになります。

#!/bin/bash

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF2 > bb.dockerfile
 FROM ubuntu:xenial-20180417
 ARG UNAME=testuser
 ARG UID=1000
 ARG GID=1000
 RUN groupadd -g \$GID \$UNAME
 RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
 USER \$UNAME
 CMD /bin/bash
EOF2    

docker build --build-arg UID=${curr_uid} --build-arg GID=${curr_gid} \
    -f bb.dockerfile -t testimg .

次に、別のスクリプトでコンテナを作成します。

#!/bin/bash

docker run -it -d -v $(pwd)/shared:/home/testuser/shared \
    --name testcontainer -P testimg
0
minghua