2017-03-10 17 views
1

私は、ubuntuをインストールするドッカーイメージと、NodeJSのインストールのような追加のコマンドを持っています。docker-composeビルド中にnpm installを実行する際の問題

Dockerfile(docker-compose.ymlと組み合わせて)は、ホスト上のディレクトリにもディレクトリをマウントします。私はdocker-compose upでコンテナを実行し、その後のマウントsrc/フォルダ内ls -aを行うと

VOLUME ["/src"] 
WORKDIR /src 

:私はボリュームのために次の行を持ってDockerfile

services: 
    test: 
    build: 
     context: ../../ 
     dockerfile: docker/Dev/Dockerfile 
    ports: 
     - 7000:7000 
    volumes: 
     - ./../../src:/src 

:それはこのようになりますコンテナの場合は、ホストにも表示されているすべてのファイルが表示されます。ここまでは順調ですね。

(コマンドは、私はコンテナ内で見て、あまりにも実行します:docker exec -it <container hash> ls -a

すべてのファイルは、私が私のDockerfileに新しいRUNコマンドを追加package.json含めて、そこにあるように見えるので:npm installを。それは私にそれがsrc/フォルダにpackage.jsonを見つけることができないというエラーが発生します除き

VOLUME ["/src"] 
WORKDIR /src 
RUN npm install 

:だから私はこれを持っています。私が持っているDockerfileでそう

私は(私はWORKDIRsrc/フォルダに切り替え、覚えておいてください)RUN ls -aを追加すると、それはそれは空のディレクトリだことを示しています...

VOLUME ["/src"] 
WORKDIR /src 

# shows that /src is empty. If I do 'RUN pwd', then it shows I really am in /src 
RUN ls -a 
RUN npm install 

しかし、私がdocker-compose upを実行した後で、ls -aをコンテナの/srcフォルダ内にもう一度実行すると、すべてのソースファイルが再び表示されます。

私の質問は、ビルド時になぜそこにいないのですか(私はdocker-compose buildを実行しています)?

この問題を解決する方法は何ですか。

答えて

3

あなたは(そのボリュームのために使用するものdocker-composedockerデーモンにDockerfileと-vフラグにVOLUMEコマンドの違いを誤解しています。あなたのdocker-composeファイル内volumesキーの下

値はあなたのイメージは、建物を終えた後にマッピングするためにどのようなディレクトリdockerを教えてください。ビルドプロセスでは使用されません。

幸いにも、作成ファイルのcontext行のために、すべてのソースファイルに自動的にアクセスできます。ローカルのsrcディレクトリにあり、現在の作業ディレクトリではありません。以下に、あなたのDockerfileを更新

試してみてください。

# NOTE: You don't want a VOLUME directive if you only want to mount a local 
# directory. WORKDIR is optional, but doesn't matter for my example, 
# so I'm omitting it. 

# Copy the npm files into your Docker image. If you do this first, the docker 
# daemon can cache the built layers, making your images build faster and be 
# substantially smaller, since most of your dependencies will remain unchanged 
# between builds. 
COPY src/package.json package.json 
COPY src/npm-shrinkwrap.json npm-shrinkwrap.json 

# Actually install the dependencies. 
RUN npm install 

# Copy all of your source files from the `src` directory into the Docker image. 
COPY src . 

さて、ここで一つの問題:あなたはおそらくすでにnpmモジュールがsrc/node_modulesの下にインストールされています。したがって、最後のCOPY行を除いて上記のすべてを削除するか、src/node_modulesをビルドルートの.dockerignoreファイルに追加することができます(../..)。

+0

私はもう一度一緒に遊んだ。 'COPY'コマンドは' package.json'を '/ src'フォルダにコピーするというトリックを行います。私は 'RUN npm install'を実行することもできます。これは動作します。これは 'node_modules'フォルダを作成することを示しています。しかし、 '' docker-compose up'を実行すると、 '/ src'ディレクトリにある' Dockerfile'の全てを上書きします。私はそれが 'docker-compose.yml'が同じ'/src'フォルダ上で '-v'を実行して、以前のすべての内容を上書きするからです。 – Vivendi

+0

ローカルディレクトリをマウントすると、イメージ内の一致する内容がローカルドライブの内容に置き換えられます。一般的には、開発中にこれを行うだけです。 – jkinkead

関連する問題