2017-08-15 11 views
13

コードを実行するように設定したOpenSuse 42.3ドッカーイメージがあります。イメージには、Dockerfileを使用して最初のイメージ生成中に作成する "myuser"という単一のユーザー(ルート以外)があります。ユーザーがどのオペレーティングシステムを使用しているかに基づいてイメージからコンテナを生成する3つのスクリプトファイルがあります。コンテナ作成時にドッカー画像のユーザー名を設定しますか?

質問:コンテナ生成スクリプトを実行するユーザーのユーザー名に、コンテナ内のユーザー名 "myuser"を設定できますか?

私の目標は、ユーザーがコンテナにインタラクティブにポップアップさせ、コンテナ内からコードを実行できるようにすることです。コードは実行してIOを持つ単なるバイナリなので、コンテナ内からユーザのディレクトリにアクセスして、マシン上のフォルダに移動してファイルシステムの出力を生成するコードを実行できるようにします。

以下は、これまでに構築したものです。私はdocker runへのLinuxスクリプトの呼び出し中にUSER環境変数を設定しようとしましたが、 "myuser"から "bob"(コンテナを起動したホストマシン上のユーザー名)と言うユーザーを変更しませんでした。ディレクトリのマウントは正常に動作しているようです。自分の目標を達成することさえ可能かどうかはわかりません。

のLinuxコンテナのスクリプト:

username="$USER" 
userID="$(id -u)" 
groupID="$(id -g)" 
home="${1:-$HOME}" 

imageName="myImage:ImageTag" 
containerName="version1Image" 

docker run -it -d --name ${containerName} -u $userID:$groupID  \ 
      -e USER=${username} --workdir="/home/myuser"   \ 
      --volume="${home}:/home/myuser" ${imageName} /bin/bash \ 

マックコンテナのスクリプト:

username="$USER" 
userID="$(id -u)" 
groupID="$(id -g)" 
home="${1:-$HOME}" 

imageName="myImage:ImageTag" 
containerName="version1Image" 

docker run -it -d --name ${containerName}       \ 
      --workdir="/home/myuser"   \ 
      --v="${home}:/home/myuser" ${imageName} /bin/bash \ 

のWindowsコンテナのスクリプト:すべての

ECHO OFF 
SET imageName="myImage:ImageTag" 
SET containerName="version1Image" 

docker run -it -d --name %containerName% --workdir="/home/myuser" -v="%USERPROFILE%:/home/myuser" %imageName% /bin/bash 


echo "Container %containerName% was created." 
echo "Run the ./startWindowsLociStream script to launch container" 
+0

この質問はなぜ控除されていますか? – wandadars

+0

それを知ってうれしいです。 Upvoted – Robert

+0

少なくともLinuxのスクリプトでは、あなたがやっているときに '-u $ userID:$ groupID'を指定するだけで、コンテナがホストファイルシステムにスタッフを書くことができるようになります。あなたはそこにいる正確な問題は何ですか? – whoan

答えて

2

以下のコードはhttps://github.com/bmitch3020/run-as-userにチェックされています。

これは、/ home/myuserの所有権をチェックし、コンテナ内のユーザーのuid/gidを更新するentrypoint.shで処理します。それはのようなものに見えることができます。

#!/bin/sh 

set -x 
# get uid/gid 
USER_UID=`ls -nd /home/myuser | cut -f3 -d' '` 
USER_GID=`ls -nd /home/myuser | cut -f4 -d' '` 

# get the current uid/gid of myuser 
CUR_UID=`getent passwd myuser | cut -f3 -d: || true` 
CUR_GID=`getent group myuser | cut -f3 -d: || true` 

# if they don't match, adjust 
if [ ! -z "$USER_GID" -a "$USER_GID" != "$CUR_GID" ]; then 
    groupmod -g ${USER_GID} myuser 
fi 
if [ ! -z "$USER_UID" -a "$USER_UID" != "$CUR_UID" ]; then 
    usermod -u ${USER_UID} myuser 
    # fix other permissions 
    find/-uid ${CUR_UID} -mount -exec chown ${USER_UID}.${USER_GID} {} \; 
fi 


# drop access to myuser and run cmd 
exec gosu myuser "[email protected]" 

をそして、ここでは関係Dockerfileからいくつかの行です:

FROM debian:9 
ARG GOSU_VERSION=1.10 

# run as root, let the entrypoint drop back to myuser 
USER root 

# install prereq debian packages 
RUN apt-get update \ 
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ 
    apt-transport-https \ 
    ca-certificates \ 
    curl \ 
    vim \ 
    wget \ 
&& apt-get clean \ 
&& rm -rf /var/lib/apt/lists/* 

# Install gosu 
RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ 
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \ 
&& chmod 755 /usr/local/bin/gosu \ 
&& gosu nobody true 

RUN useradd -d /home/myuser -m myuser 
WORKDIR /home/myuser 

# entrypoint is used to update uid/gid and then run the users command 
COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
CMD /bin/sh 

がそれを実行するために、次に、あなただけのボリュームとしての/ home/myuserのをマウントする必要があり、それが調整されますエントリポイントのアクセス許可。例えば:そのコンテナ内

$ docker build -t run-as-user . 
$ docker run -it --rm -v $(pwd):/home/myuser run-as-user /bin/bash 

あなたは/ホーム/ myuserのファイルへのアクセス権を持っていることを確認するためにidls -lを実行することができます。

+0

興味深いアプローチ。 +1 – VonC

0

ファースト(https://docs.docker.com/engine/reference/builder/#arg):

警告:githubキー、ユーザーの資格情報など の秘密を渡すためにビルド時変数を使用することはお勧めしません。ビルド時変数 の値は、ドッカーの履歴 コマンドを使用して、

しかし、あなたはまだこれを実行する必要がある場合は、https://docs.docker.com/engine/reference/builder/#argをお読みください。

A Dockerfileは、1つまたは複数のARG命令を含むことができます。 USER命令がユーザ名(またはUID)を設定

と ユーザーグループ(またはGID)を任意選択

FROM busybox 
ARG user1 
ARG buildno 
... 

https://docs.docker.com/engine/reference/builder/#userたとえば、 以下が有効Dockerfileありますイメージを実行しているときに使用し、DockerfileのCMD およびENTRYPOINT命令に従います。

USER <user>[:<group>] or 
USER <UID>[:<GID>] 
+0

これはコンテナの作成時間ではなく、画像の構築時間ですか? – gesellix

+0

イメージ作成中にビルド変数を渡したくありません。私はちょうどコンテナ内の環境を、コンテナを実行しているユーザの環境に合わせたいと思っています。 – wandadars

3

ユーザ名は重要ではありません。重要なのは、uidとgidの値です。

コンテナ内のユーザーmyuserは、uidが1000(最初の非ルートユーザーID)になります。したがって、コンテナを起動してホストマシンからコンテナプロセスを見ると、ホストマシン上で1000のuidを持つユーザがコンテナを所有していることがわかります。

あなたが使用してコンテナを実行したら、あなたはユーザーを指定することでこれをオーバーライドすることができます。

docker run --user 1001 ... 

そこであなたは、コンテナ内のユーザーをしたい場合は、ユーザーが所有しているホストマシン上のファイルにアクセスできるようにするには、 uidが1005の場合、--user 1005を使用してコンテナを実行してください。

ユーザーがコンテナとホストの間のマッピング方法を理解するには、このすばらしい記事をご覧ください。 https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf

関連する問題