web-dev-qa-db-ja.com

Dockerfile(Alpine)内でSudoを使用する

私はこのDockerfileを持っています...

FROM keymetrics/pm2:latest-Alpine

RUN apk update && \
    apk upgrade && \
    apk add \
       bash

COPY . ./

EXPOSE 1886 80 443

CMD pm2-docker start --auto-exit --env ${NODE_ENV} ecosystem.config.js

CMDを使用してSudoコマンドを実行するにはどうすればよいですか?

ポート443はSudoユーザーにのみ許可されているため、これを行う必要があります。

9
ridermansb

Su-execはAlpineで使用できます。パッケージを追加します。まだ利用できない場合は、Dockerfileに以下を追加します

RUN apk add --no-cache su-exec

Docker内で実行するスクリプト内で、次を使用して別のユーザーになることができます。

exec su-exec <my-user> <my command>

または、docker-fileのビルド中に、より使いやすいSudoパッケージを追加することもできます。次のコードをDockerfileに追加します。

RUN set -ex && apk --no-cache add Sudo

その後、Sudoを使用できます

Sudo -u <my-user> <my command>
16
Gerbrand

Sudoには通常Alpineイメージが付属していないため、コンテナー内に含めることはほとんど意味がありません。必要なのは、小さい番号のポートにバインドするためのSudoではなく、rootユーザー自体であり、Sudoはマルチユーザー環境でrootアクセスを取得するための一般的な方法にすぎません。コンテナーにSudoが含まれている場合は、ユーザーにパスワードを設定するか、パスワードなしでコマンドを実行できるようにする必要があります。どちらを選択したかに関係なく、コンテナー内で特権の昇格が行われ、通常のユーザーとしてコンテナーを実行する目的が無効になるため、その時点でコンテナーをルートとして実行することもできます。

アップストリームイメージがroot以外のユーザーとして実行するように構成されている場合(ビルド中にapkコマンドを実行するためとは異なります)、DockerfileでUSER rootを指定できます。以下のすべての手順は次のように実行されますコンテナーのentrypoint/cmdを含む、デフォルトでroot。

コンテナを別のユーザーとして起動した場合。 docker run -u 1000 your_imageの場合、rootとしてコマンドを実行するには、-u 1000オプションを削除します。これは、コンテナーを非rootユーザーとして実行することを制限するより高いセキュリティー環境で実行する場合に問題になる可能性があります。

アプリケーション自体がroot権限を削除している場合、アプリケーション自体がSudoを内部で呼び出さない限り、Sudoを含めても役に立たない可能性があります。その場合は、アプリケーションを更新して、ポートにバインドした後にルート権限を削除してください。

最も重要なことは、コンテナー内のrootの唯一の理由が番号の小さいポートにバインドすることである場合、コンテナー内のアプリケーションを番号の大きいポートにバインドするように構成します。 8080と8443。このコンテナポートをホスト上の任意のポート(80と443を含む)にマッピングできるため、外部からの影響はありません。例えば。 docker run -p 80:8080 -p 443:8443 your_image。これにより、イメージが簡素化され(Sudoなどのツールが削除されます)、同時にセキュリティが向上します。

6
BMitch