31285


### 困っていること

`docker-compose up -d`
でnginxを起動、自動起動化まで自動で実施してくれるようにしたいと考えて試行錯誤していますが、うまく動作してくれません。  
Dockerfileの"RUN systemctl start nginx"の行でエラーが出力されてしまいます。

[code]

    Building nginx
    Step 1 : FROM centos:centos7
     ---> 67591570dd29
    Step 2 : MAINTAINER nginx
     ---> Using cache
     ---> c36597f0415d
    Step 3 : RUN yum -y install epel-release;
     ---> Using cache
     ---> 6708fdc2009f
    Step 4 : RUN yum -y install nginx
     ---> Using cache
     ---> 15b951c70751
    Step 5 : RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime
     ---> Using cache
     ---> 52a75e8f3f4a
    Step 6 : COPY nginx.conf /etc/nginx/nginx.conf
     ---> Using cache
     ---> 2b78c951f9f3
    Step 7 : RUN systemctl start nginx
     ---> Running in 93eae267d64c
    Failed to get D-Bus connection: Operation not permitted
    ERROR: Service 'nginx' failed to build: The command '/bin/sh -c systemctl start nginx' returned a non-zero code: 1
    
[/code]

"RUN systemctl start nginx"を省いた状態では、正常に動作してくれます。  
（後ほどdocker execでコンテナに入り、"systemctl start nginx"する必要はあります）

### 期待する状態

`docker compose up -d`
でnginxの起動まで自動化するにはどのように記述すればよろしいのでしょうか。お手数ですがご教示をお願いいたします。（参考URLを貼って頂くだけでも構いません）

※尚、下記URLに記載の内容とほぼ同じ内容なのですが、下記URLでは"カーネルのアップデートが実施できない"ということがメインですので改めて質問させていただきました。  
[Dockerfileから、centos7のサービスを起動したい](https://ja.stackoverflow.com/questions/5544/dockerfile%E3%81%8B%E3%82%89-centos7%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E3%81%84)

### 環境とファイルの記述

■環境

[code]

    [root@gab docker]# cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)
    [root@gab docker]# uname -r
    3.10.0-514.2.2.el7.x86_64
    
[/code]

■docker-compose.yml

[code]

    nginx:
    build: "."
    container_name: "nginx"
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - /etc/letsencrypt/:/etc/letsencrypt/
    command: /sbin/init
    
[/code]

■Dockerfile

[code]

    # CentOS 7.2のイメージ
    FROM centos:centos7
    
    MAINTAINER nginx
    
    # システムアップデートとリポジトリ追加
    RUN yum -y install epel-release;
    
    # nginx他インストール
    RUN yum -y install nginx
    
    # timezone変更
    RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime
    
    # nginx.confgのコピー
    COPY nginx.conf /etc/nginx/nginx.conf
    
    RUN systemctl start nginx
    
[/code]


CC BY-SA 4.0
2016-12-21T04:44:50.677
31280
2020-03-05T05:26:16.560
2020-06-17T08:14:45.997
-1
19971
question
docker docker-compose systemd
Dockerfileでのsystemctl実行方法について


Dockerfileはコンテナ(プロセス)を起動するためのものではありません。  
コンテナイメージを作成するためのものです。  
コンテナイメージとは、ざっくり言ってファイル群とDockerのメタ情報をまとめたもので、コンテナを起動する起点です。  
要するに、コンテナで実行したいプロセスに必要なファイル群を集めるのがDockerfileの主な役目です。

つまり、`RUN systemctl start nginx`のように、プロセスの起動を目的としたコマンドをDockerfileに書いても意味がありません。  
Dockerfileで作ったコンテナイメージを`docker-compose up`したときに`systemctl start
nginx`を実行したいのであれば、docker-
compose.ymlに[command設定](https://docs.docker.com/compose/compose-
file/#/command)を書くか、Dockerfileに[CMD](https://docs.docker.com/engine/reference/builder/#/cmd)か[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#/entrypoint)を指定しておけばいいはずです。

また、コンテナ内ではsystemdが起動するわけではないので、そもそも`systemctl`でnginxを起動するのも間違っています。  
nginxを直接起動するか、[dumb-init](https://github.com/Yelp/dumb-init)のようなツールを使うべきです。


CC BY-SA 3.0
2016-12-21T06:18:40.130
31285
2016-12-21T06:24:20.487
2016-12-21T06:24:20.487
19437
19437
31280
answer