web-dev-qa-db-ja.com

JenkinsによってHTTP_PROXYの背後にあるDockerfileでDockerイメージを構築する方法は?

Dockerイメージの構築はデスクトップで問題なく機能します。 Node.js NPM依存関係のインストールは通常どおり機能します。ただし、企業プロキシの背後でホストされているJenkinsなどの継続的統合サーバーを使用すると、Dockerイメージのビルドは失敗します。

Node.js NPMの依存関係

Node.jsパッケージをビルドしているときに、GIT依存関係のクローンを作成中にGITに接続できない場合、コマンドnpm installは失敗します。

e1ce5e8407d1: Already exists
Status: Image is up to date for node:0.10.33
 ---> e1ce5e8407d1
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 965cad0c68b0
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 4c498f0c07e9
Step 3 : COPY package.json /usr/src/app/
 ---> b0662a8275fb
Removing intermediate container 5aca20551452
Step 4 : RUN npm install
 ---> Running in 7ccf9e5362af
npm WARN package.json [email protected] No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using 'async-cache@^0.1.5' from dependencies
npm ERR! git clone https://github.com/npm/npm2es.git Cloning into bare repository '/root/.npm/_git-remotes/https-github-com-npm-npm2es-git-60a75edb'...
npm ERR! git clone https://github.com/npm/npm2es.git fatal: unable to access 'https://github.com/npm/npm2es.git/': Failed to connect to github.com port 443: Connection timed out

Java Maven、Ruby、Go Dockerイメージと依存関係

同じことが、Java、RubyまたはGoコンテナをビルドする場合にも発生します。Goコンテナでは、企業のプロキシサーバー全体のリポジトリサーバーに依存関係があります。

HTTP_PROXY環境変数を使用してDockerを構成できることを知っているので、CI環境で適切にイメージを構築するようにDockerを適切に構成する方法は?

20

注:Docker 1.9mightはこれを解決するのに役立ちます:

  • " Issue 14634 ":Builder-ビルド時の引数の引き渡し(例:HTTP_PROXY
  • " PR 15182 ":ビルドコンテキストでのビルド時変数の受け渡しのサポート

使用法(提案):

docker build --build-arg http_proxy=http://my.proxy.url  --build-arg foo=bar <<MARK
FROM busybox
RUN <command that need http_proxy>
ARG --description="foo's description" foo
USER $foo
MARK
36
VonC

私がしなければなりませんでした

docker build --no-cache --build-arg HTTP_PROXY=$http_proxy \
--build-arg HTTPS_PROXY=$http_proxy --build-arg NO_PROXY="$no_proxy" \
--build-arg http_proxy=$http_proxy --build-arg https_proxy=$http_proxy \
--build-arg no_proxy="$no_proxy" -t myContainer /path/to/Dockerfile/directory

ここで、$http_proxyおよび$no_proxyは私のbashrcで設定されました。両方を使用しましたHTTP_PROXYおよびhttp_proxy異なるユーティリティが異なる変数をチェックするため(curlは両方をチェックし、wgetは小文字のみをチェックするなど)。設定ENV http_proxy http://proxy.mycompany.com:80は、実行時ではなくビルド時にこれらの変数を使用しようとしていたため、役に立ちませんでした。

11
jeremysprofile

Docker Daemon HTTPプロキシ

DockerデーモンのHTTP_PROXY環境変数の設定に関する多くのドキュメントが利用可能です。環境変数はコンテナの実行の場合にのみ使用できるため、ここでは役に立ちません。

Dockerfileのソリューション

Dockerfileで環境変数HTTP_ENVまたはhttp_envを設定すると役立つ場合がありますが、これも原因にはなりません。

ENV http_proxy http://proxy.mycompany.com:80

その理由は、特定の各サービスが異なる方法でHTTPプロキシ設定のみを尊重するためです。私が解決できる方法は以下の通りです。

  • NPM:NPMでは、CLIコマンドを使用してHTTP_PROXY変数を設定する必要があります。
  • GIT:GITでは、CLIコマンドを使用してHTTP_PROXY変数も設定する必要があります。
  • MAVEN:MVNコマンドでは、HTTP_PROXYをXMLファイルとして、ユーザーのディレクトリ〜/ .m2/settings.xmlの下に設定する必要があります。 Dockerの場合、ルートの「/root/.m2/settings.xml」ディレクトリ(安全でない、開発専用)、またはDockerfileのユーザーのホームディレクトリに追加できます。

たとえば、Dockerfileを使用してアプリケーションを実行すると、次のDockerfileを使用してイメージを構築できます。

FROM node:0.10.33

# Prepare
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Use the cache for dependencies
COPY package.json /usr/src/app/

# If building behind an http_proxy, set them for git and npm
RUN git config --global http.proxy http://qypprdproxy02.ie.company.net:80 && \
    npm config set proxy http://qypprdproxy02.ie.company.net:80 && \
    npm config set https-proxy http://qypprdproxy02.ie.company.net:80

# Install dependencies
RUN npm install

# Copy all the source
COPY . /usr/src/app

# Execute the dev steps
COPY ./numbat-config.example.js /usr/src/app/numbat-config.js
COPY ./.env.example /usr/src/app/.evn
RUN touch /usr/src/app/config.admin.js

CLIコマンドを使用してGITとNPMの両方を構成し、NPMインストールコマンドを実行する前にプロキシ設定を明示的に取得していることに注意してください。これにより、NPMとGITの両方の依存関係がそれぞれ自動的に取得および複製されます。

このDockerfileを使用してイメージを構築した結果は、期待どおりに機能します。

[root@pppdc9prd6dq newww]# fig build
...
...
Building npmregistryserver...
 ---> Using cache
 ---> 965cad0c68b0
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 4c498f0c07e9
Step 3 : COPY package.json /usr/src/app/
 ---> ae8ff7861246
Removing intermediate container ba1d7b8c9963
Step 4 : RUN npm config set proxy http://qypprdproxy02.ie.company.net:80 &&     npm config set https-proxy http://qypprdproxy02.ie.company.net:80 &&     npm install
 ---> Running in aa6e05d9c7a4
npm WARN package.json [email protected] No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using 'async-cache@^0.1.5' from dependencies
npm WARN deprecated [email protected]: Please update to the latest version.

> [email protected] install /usr/src/app/node_modules/gulp/node_modules/v8flags
> node fetch.js


> [email protected] install /usr/src/app/node_modules/hiredis
> node-gyp rebuild

make: Entering directory '/usr/src/app/node_modules/hiredis/build'
  CC(target) Release/obj.target/hiredis/deps/hiredis/hiredis.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/net.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/sds.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/async.o
  AR(target) Release/obj.target/deps/hiredis.a
  COPY Release/hiredis.a
  CXX(target) Release/obj.target/hiredis/src/hiredis.o
  CXX(target) Release/obj.target/hiredis/src/reader.o
  SOLINK_MODULE(target) Release/obj.target/hiredis.node
  SOLINK_MODULE(target) Release/obj.target/hiredis.node: Finished
  COPY Release/hiredis.node
make: Leaving directory '/usr/src/app/node_modules/hiredis/build'
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})

> [email protected] postinstall /usr/src/app/node_modules/imagemin-pngcrush/node_modules/pngcrush-bin
> node lib/install.js

     fetch : https://raw.githubusercontent.com/imagemin/pngcrush-bin/v1.0.0/vendor/linux/pngcrush


✔ pre-build test passed successfully!

> [email protected] install /usr/src/app/node_modules/npm-typeahead/node_modules/restify/node_modules/dtrace-provider
> scripts/install.js

npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN cannot run in wd [email protected] gulp build (wd=/usr/src/app)
[email protected] node_modules/newww-metrics

[email protected] node_modules/murmurhash

[email protected] node_modules/npm-humans

[email protected] node_modules/leven

[email protected] node_modules/chunk

[email protected] node_modules/npm-expansions

[email protected] node_modules/similarity

[email protected] node_modules/truncate

これは期待どおりに正しく機能し、このDockerfileに基づいてイメージを再構築するために、httpプロキシの背後にCI/CD環境を作成できます。

11

私たちはやっています...

ENV http_proxy http://9.9.9.9:9999
ENV https_proxy http://9.9.9.9:9999

そしてdockerfileの最後に...

ENV http_proxy ""
ENV https_proxy ""

これは、今のところ(dockerがビルド環境変数を導入するまで)、プロキシ変数を公開せずにビルドに使用できるようにします

3
danday74

Docker 17.07以降では、代わりにDocker Client構成ファイルを使用して、プロキシ構成を一元的に提供できます。

https://docs.docker.com/network/proxy/#configure-the-docker-client

2
desolat

次の説明に従って、透過プロキシを使用できます。

https://jpetazzo.github.io/2014/06/17/transparent-squid-proxy-docker/

docker run --net Host jpetazzo/squid-in-a-can
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3129
0
Atila Romero

企業ネットワークがdockerイメージのダウンロードとセットアップを許可していないときに問題が発生したため、n/wからhttpプロキシ情報が提供されました。 docker image buildを実行中に変数を渡しましたが、問題なく機能しました。

  docker build  --build-arg http_proxy="http://userid:[email protected]:8080" - < Dockerfile
0