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から削除することです。
ビルド引数として渡すことができます。 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リポジトリにあります。
最終的に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