420

Git でさまざまな楽しいことを実行するアプリ (git clone や git push の実行など) があり、それを Docker 化しようとしています。

コンテナーの「ユーザー」が使用するコンテナーに SSH キーを追加できるようにする必要があるという問題が発生しています。

にコピーし/root/.ssh/、変更$HOMEし、git ssh ラッパーを作成しようとしましたが、まだ運がありません。

参照用の Dockerfile は次のとおりです。

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js次のようなgitコマンドを実行しますgit pull

4

34 に答える 34

95

Ubuntu を使用している場合、ssh_config が正しくないことが判明しました。追加する必要があります

RUN  echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

ssh キーを認識させるために、Dockerfile に追加します。

于 2013-08-09T00:19:13.667 に答える
74

docker composeを使用している場合、簡単な選択は次のように SSH エージェントを転送することです。

something:
    container_name: something
    volumes:
        - $SSH_AUTH_SOCK:/ssh-agent # Forward local machine SSH key to docker
    environment:
        SSH_AUTH_SOCK: /ssh-agent
于 2016-04-15T13:24:24.267 に答える
67

Peter Grainger の回答を拡張するDocker 17.05 以降で利用可能なマルチステージ ビルドを使用することができました。公式ページには次のように記載されています。

マルチステージ ビルドでFROMは、Dockerfile で複数のステートメントを使用します。各FROM命令は異なるベースを使用でき、それぞれがビルドの新しい段階を開始します。アーティファクトをあるステージから別のステージに選択的にコピーして、最終イメージに不要なものをすべて残すことができます。

ここでこれを念頭に置いて、Dockerfile3 つのビルド ステージを含める例を示します。これは、クライアント Web アプリケーションの運用イメージを作成するためのものです。

# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
    echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
    printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
    yarn --pure-lockfile --mutex file --network-concurrency 1 && \
    rm -rf /root/.ssh/

# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod

# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]

.dockerignoreファイルの内容を繰り返します(プロジェクトの結果のディレクトリがコピーされるのを.gitignore防ぎます):node_modulesdist

.idea
dist
node_modules
*.log

イメージをビルドするコマンド例:

$ docker build -t ezze/geoport:0.6.0 \
  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
  --build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
  ./

SSH 秘密鍵にパスフレーズがない場合は、空のSSH_KEY_PASSPHRASE引数を指定してください。

これがどのように機能するかです:

1)。最初の段階でのみpackage.jsonyarn.lockファイルとプライベート SSH キーが という名前の最初の中間イメージにコピーされsourcesます。今後 SSH キーのパスフレーズ プロンプトが表示されないようにするために、自動的に に追加されssh-agentます。最後にyarn、コマンドは NPM から必要なすべての依存関係をインストールし、SSH 経由で Bitbucket からプライベート git リポジトリを複製します。

2)。第 2 段階では、Web アプリケーションのソース コードをビルドおよび縮小しdist、次の中間イメージのディレクトリに配置しproductionます。installed のソース コードは、最初の段階で生成されたnode_modulesという名前のイメージから次の行でコピーされることに注意してください。sources

COPY --from=sources /app/ /app/

おそらく、次の行でもある可能性があります。

COPY --from=sources /app/node_modules/ /app/node_modules/

node_modulesここには、最初の中間イメージからのディレクトリのみがSSH_KEYあり、SSH_KEY_PASSPHRASE引数はありません。ビルドに必要な残りのすべては、プロジェクト ディレクトリからコピーされます。

3)。第 3 段階では、名前が付けられた 2 番目の中間イメージからディレクトリezze/geoport:0.6.0のみを含め、Web サーバーを起動するために Node Express をインストールすることで、タグ付けされる最終イメージのサイズを縮小します。distproduction

画像を一覧表示すると、次のような出力が得られます。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ezze/geoport        0.6.0               8e8809c4e996        3 hours ago         717MB
<none>              <none>              1f6518644324        3 hours ago         1.1GB
<none>              <none>              fa00f1182917        4 hours ago         1.63GB
node                carbon              b87c2ad8344d        4 weeks ago         676MB

ここで、タグの付いていないイメージは、最初と 2 番目の中間ビルド ステージに対応します。

あなたが実行する場合

$ docker history ezze/geoport:0.6.0 --no-trunc

最終的なイメージでは、SSH_KEYとについての言及は見られません。SSH_KEY_PASSPHRASE

于 2018-02-01T14:25:37.423 に答える
39

コンテナー内に ssh キーを挿入するには、複数のソリューションがあります。

  1. 命令でDockerfile を使用すると、ADDビルド プロセス中に挿入できます。

  2. 単に次のようなことをするcat id_rsa | docker run -i <image> sh -c 'cat > /root/.ssh/id_rsa'

  3. docker cpコンテナの実行中にファイルを挿入できるコマンドを使用します。

于 2013-08-08T21:44:52.833 に答える
15

Docker コンテナーは、独自の「サービス」と見なす必要があります。懸念事項を分離するには、機能を分離する必要があります。

1) データはデータ コンテナー内にある必要があります。リンクされたボリュームを使用してレポのクローンを作成します。そのデータ コンテナーは、それを必要とするサービスにリンクできます。

2) コンテナーを使用して git クローン作成タスクを実行します (つまり、ジョブはクローン作成のみです)。実行時にデータ コンテナーをコンテナーにリンクします。

3) ssh-key についても同様です。これを (上で提案したように) ボリュームとして配置し、必要なときに git clone サービスにリンクします。

そうすれば、クローン作成タスクとキーの両方が一時的になり、必要な場合にのみアクティブになります。

アプリ自体が git インターフェースである場合は、github または bitbucket REST API を直接使用して作業を行うことを検討することをお勧めします。それが設計された理由です。

于 2015-06-23T00:37:32.643 に答える
14

この行は問題です:

ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa

イメージにコピーするファイルを指定するときは、相対パス (Dockerfile があるディレクトリからの相対パス) のみを使用できます。したがって、代わりに次を使用する必要があります。

ADD id_rsa /root/.ssh/id_rsa

id_rsa ファイルを Dockerfile と同じディレクトリに配置します。

詳細については、こちらをご覧ください: http://docs.docker.io/reference/builder/#add

于 2014-04-17T12:22:08.323 に答える
13

私は今日同じ問題に遭遇し、以前の投稿で少し修正されたバージョンで、このアプローチが私にとってより便利であることがわかりました

docker run -it -v ~/.ssh/id_rsa:/root/.my-key:ro image /bin/bash

(読み取り専用フラグなので、コンテナがどのような場合でも私の ssh キーを台無しにしないことに注意してください。)

コンテナ内で実行できるようになりました:

ssh-agent bash -c "ssh-add ~/.my-key; git clone <gitrepourl> <target>"

Bad owner or permissions on /root/.ssh/..だから私は@krossによって指摘されたそのエラーを取得しません

于 2016-12-28T16:21:50.917 に答える
10

この問題は本当に悩ましい問題です。dockerfile コンテキスト外でファイルを追加/コピーすることはできないため、~/.ssh/id_rsa をイメージの /root/.ssh/id_rsa にリンクすることは不可能であり、sshed 操作を実行するためにキーが確実に必要な場合プライベート リポジトリ リンクからの git clone のように...、docker イメージのビルド中に。

とにかく、私は回避策の解決策を見つけました。それほど説得力はありませんが、うまくいきました。

  1. あなたのdockerfileで:

    • このファイルを /root/.ssh/id_rsa として追加します
    • git clone、composer など、必要なことを行います...
    • 最後に rm /root/.ssh/id_rsa
  2. 1 回の撮影で実行するスクリプト:

    • dockerfile を保持しているフォルダーへのキーを cp します
    • ドッカービルド
    • rm コピーしたキー
  3. いくつかの ssh 要件でこのイメージからコンテナーを実行する必要があるときはいつでも、次のように実行コマンドに -v を追加するだけです。

    docker run -v ~/.ssh/id_rsa:/root/.ssh/id_rsa --name コンテナー イメージ コマンド

このソリューションにより、プロジェクトのソースとビルドされた Docker イメージの両方に秘密鍵がなくなるため、セキュリティの問題について心配する必要がなくなります。

于 2015-05-01T05:21:33.060 に答える
8

Docker コンテナー内での SSH の課題の簡潔な概要については、こちらで詳しく説明しています。シークレットを漏らさずにコンテナー内から信頼できるリモートに接続するには、いくつかの方法があります。

これらを超えて、Compose を使用する場合、実行時にアクセス可能な別個の Docker コンテナーで実行されるキーストアを使用する可能性もあります。ここでの欠点は、HashiCorp による Vaultなどのキーストアを作成および管理するために必要な機構が原因で、複雑さが増すことです。

スタンドアロンの Docker コンテナーでの SSH キーの使用については、上記のリンク先の方法を参照し、特定のニーズに応じてそれぞれの欠点を検討してください。ただし、Compose 内で実行していて、実行時にアプリにキーを共有したい場合 (OP の実用性を反映して)、これを試してください。

  • ファイルを作成し、docker-compose.envファイルに追加し.gitignoreます。
  • キーを必要とするサービスを更新してdocker-compose.yml追加します。env_file
  • process.node.DEPLOYER_RSA_PUBKEYNode.js アプリケーションの場合など、アプリケーションの実行時に環境から公開鍵にアクセスします。

上記のアプローチは開発とテストに理想的であり、本番環境の要件を満たすことはできますが、本番環境では上記の他の方法のいずれかを使用することをお勧めします。

その他のリソース:

于 2019-09-27T05:23:59.433 に答える
4

docker (17.05) の以降のバージョンでは、マルチ ステージ ビルドを使用できます。以前のビルドは後続のビルドでのみ使用でき、その後破棄されるため、これが最も安全なオプションです。

詳細については、スタックオーバーフローの質問への回答を参照してください

于 2018-01-15T12:22:13.410 に答える
2

私は別の方法で問題を解決しようとしています: 公開 ssh キーをイメージに追加します。しかし、試してみると、「docker cp」はコンテナーからホストにコピーするためのものであることがわかりました。creak による回答の項目 3 は、docker cp を使用してファイルをコンテナーに挿入できると言っているようです。https://docs.docker.com/engine/reference/commandline/cp/を参照してください

抜粋

ファイル/フォルダーをコンテナーのファイル システムからホスト パスにコピーします。パスはファイルシステムのルートからの相対パスです。

  Usage: docker cp CONTAINER:PATH HOSTPATH

  Copy files/folders from the PATH to the HOSTPATH
于 2014-01-02T21:18:34.007 に答える
-2

最も簡単な方法は、ランチパッド アカウントを取得して使用します: ssh-import-id

于 2013-11-24T02:50:53.603 に答える
-2

実行中の docker コンテナーでは、docker -i (対話型) オプションを指定して ssh-keygen を発行できます。これにより、コンテナー プロンプトが転送され、docker コンテナー内にキーが作成されます。

于 2015-04-14T06:46:51.977 に答える