web-dev-qa-db-ja.com

docker-composeの一部である場合、カスタムnginxコンテナーはすぐに終了します

私は、リクエストをゴーストコンテナに再ルーティングするnginxコンテナの簡単なセットアップで、Docker Composeを使用する方法を学ぼうとしています。標準のゴーストイメージを使用していますが、カスタムのnginxイメージ(標準イメージから継承)があります。

「docker-compose up」を使用してコンポジションを実行すると、「docker_nginx_1 exited with code 0」ですぐに終了します。ただし、手動でビルドして実行すると正常に実行され、ブラウザーをコンテナーに移動してデフォルトのnginxページを表示できます。作成ファイルがカスタムビルドとは異なる動作をする原因となる、作成ファイルについて誤解していることは何ですか?実行し続けるために何を変更できますか?

免責事項:私は行くと同時にnginxも学んでいるので、一度に2つのことを学ぶことは過度の問題を引き起こすかもしれません。

編集:元のファイルはもう少し複雑でしたが、問題を単純に減らしました:デフォルトのnginxイメージを継承するだけのカスタムイメージにbuildコマンドを使用すると、すぐに終了します。デフォルトのnginxイメージを使用すると、機能します。これらは現在関連のあるファイルです:

構成ファイル:

ghost:
 expose:
   - "2368"
 image: ghost

nginx:
  # image: nginx << If I use this instead of my custom build, it doesn't exit
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

nginx/Dockerfile:

FROM nginx

元のファイル(上記と同じ構成ファイルを使用):

nginx/Dockerfile:

FROM nginx
RUN rm /etc/nginx/nginx.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost
RUN mkdir /etc/nginx/sites-enabled
RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

EXPOSE 80 443

# Is this even the right command I have no idea

CMD service nginx start

nginx/conf/nginx.conf:

daemon off;

user  nginx;
# Let nginx figure out the processes I guess
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx/conf/sites-available/ghost

server {
  listen 80;
  server_name 127.0.0.1;
  access_log /var/log/nginx/localhost.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_Host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://0.0.0.0:2368;
    proxy_redirect off;
  }
}

構成を実行する:

plays-MacBook-Pro:docker play$ docker-compose up
Creating docker_ghost_1...
Creating docker_nginx_1...
Attaching to docker_ghost_1, docker_nginx_1
docker_nginx_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping docker_ghost_1... done

手動で実行する:

plays-MacBook-Pro:nginx play$ docker build --no-cache -t nginx_custom .
Sending build context to Docker daemon 8.704 kB
Step 0 : FROM nginx
 ---> 914c82c5a678
Step 1 : RUN rm /etc/nginx/nginx.conf
 ---> Running in 4ce9de96bb36
 ---> 98f97a9da4fc
Removing intermediate container 4ce9de96bb36
Step 2 : ADD conf/nginx.conf /etc/nginx/nginx.conf
 ---> dd3e089208a9
Removing intermediate container 36b9a47e0806
Step 3 : ADD conf/sites-available/ghost /etc/nginx/sites-available/ghost
 ---> 55fae53e5810
Removing intermediate container a82741d24af4
Step 4 : RUN mkdir /etc/nginx/sites-enabled
 ---> Running in 7659ead01b7b
 ---> 406be1c42394
Removing intermediate container 7659ead01b7b
Step 5 : RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
 ---> Running in e9658a08affa
 ---> 021a84216e8a
Removing intermediate container e9658a08affa
Step 6 : EXPOSE 80 443
 ---> Running in 230e4523794c
 ---> 23d85e1a04cb
Removing intermediate container 230e4523794c
Step 7 : CMD service nginx start
 ---> Running in 209e129cae21
 ---> d7004d6fa223
Removing intermediate container 209e129cae21
Successfully built d7004d6fa223
plays-MacBook-Pro:nginx play$ docker run -t nginx_custom
[It sits here on an empty line, running in the background]
19
Merrillogic

これと同じ問題にぶつかり、最初のfixdocker-compose.ymlのサービスの名前を変更することでした。

これは機能しましたが、reasonが機能したのは、Docker-composeがビルドをキャッシュし、それをサービス名に結び付けるためです。最初のものの後のすべてのdocker-compose upは前に構築したものを使用するため、Dockerfile、またはdocker-compose.ymlのそのセクションに加えた変更は基本的に無視されます。

あなた(と私)がサービス名を変更すると、そのサービス名は以前にタグ付けされていないため、新しいビルドがトリガーされました。

real解決策は: docker-compose build を実行して、イメージを再構築します(その後にdocker-compose upが続きます) )。彼らのドキュメントはこの問題を本当に強調していません。

21
Gerrat

DockerfileのCMDは、フォアグラウンドで実行する必要があるプロセスを開始する必要があります。コマンドservice nginx startはプロセスをデーモンモードで実行するため、serviceコマンドが終了するため、コンテナーは正常に終了します。

次のCMD ["nginx", "-g", "daemon off;"]を使用してnginxを起動し( official image から取得)、正常に動作するはずです。

29
michal kralik

追加することもできます

tty: true

docker-compose.yml

webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true

そしてそれは後に実行し続ける必要があります

docker-compose up
11
Bernhard Zürn

私はそれが何であるかを理解しました。コンポジションのnginx部分に「nginx」以外の名前を付ける必要がありました。すでにnginxイメージがあるのか​​、それとも何か他のものであるのかはわかりませんが、それを変更すると正常に動作しました。

作成ファイルを次のように変更します。

ghost:
 expose:
   - "2368"
 image: ghost

mything:
  # image: nginx
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

私はそれを機能させることができました。インジケータは、名前が変更されたときに、実際にコンテナのビルドプロセスの出力を見たことでした。命名がそのようにする必要がある理由を誰かが正確に知っているなら、私は知りたいです。

5
Merrillogic