私はこの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ユーザーにのみ許可されているため、これを行う必要があります。
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>
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などのツールが削除されます)、同時にセキュリティが向上します。