45116


お世話になっております。

docker-compose up -dを実行した際に、各コンテナの起動→シェルをバックグラウンド実行させたいと思っております。

docker-compose.ymlを下記のように作成しました。

[code]

    version: "3"
    services:
      test:
        image: test:latest
        tty: true
        stdin_open: true
        working_dir: /opt/test
        command: bash -c "./test.sh &"
    
[/code]

しかし、docker-compose up -dを実行すると、コンテナがexitの状態で作成されます。  
また、最終行の"./test.sh
&"を"./test.sh"にすると、バックグラウンドで動いているようですが、コンテナ内でbashが起動しておらず、docker exec -it test
bash で入らなければなりません。

docker-compose up -d
コマンドだけで、コンテナ起動→bashによるシェルのバックグラウンド実行→デタッチまで行うためには、どのようにすればよいのでしょうか。


CC BY-SA 4.0
2018-06-26T05:20:06.763
45081
2018-09-18T11:00:47.880
22519
question
docker docker-compose
docker-compose.ymlにおける、初期コマンドのバックグラウンド実行


下記のコードで再現と改善をしてみました。  
意図されていることとあっているでしょうか。

コンテナをビルドします。

[code]

    $ cat Dockerfile
    FROM ubuntu:18.04
    
    COPY test.sh /opt/test/test.sh
    $ cat test.sh
    #! /bin/sh
    
    echo running background! > /tmp/cmd.log
    $ docker build -t test .
    Sending build context to Docker daemon  33.42MB
    Step 1/2 : FROM ubuntu:18.04
     ---> 113a43faa138
    Step 2/2 : COPY test.sh /opt/test/test.sh
     ---> 2bd8dc58d62d
    Removing intermediate container 138e6b2c52ee
    Successfully built 2bd8dc58d62d
    Successfully tagged test:latest
    $ 
    
[/code]

ビルドしたコンテナを使って再現します。

[code]

    $ docker-compose up -d
    Creating compose_test_1 ... done
    $ docker-compose ps
         Name              Command         State    Ports
    -----------------------------------------------------
    compose_test_1   bash -c ./test.sh &   Exit 0        
    $ 
    
[/code]

下記の通りcommandを修正します。

[code]

    $ git diff --word-diff
    diff --git a/docker-compose.yml b/docker-compose.yml
    index fdfa503..a504ca6 100644
    --- a/docker-compose.yml
    +++ b/docker-compose.yml
    @@ -5,4 +5,4 @@ services:
        tty: true
        stdin_open: true
        working_dir: /opt/test
        command: bash -c "./test.sh [-&"-]{+& tail -f /dev/null"+}
    $ 
    
[/code]

起動して確認します。

[code]

    $ docker-compose up -d
    Recreating compose_test_1 ... done
    $ docker-compose ps
         Name                   Command               State   Ports
    ---------------------------------------------------------------
    compose_test_1   bash -c ./test.sh & tail - ...   Up           
    $ docker-compose exec test cat /tmp/cmd.log
    running background!
    $
    
[/code]

docker attachしたいという事でしたので下記のように修正してみました。

[code]

    $ cat test.sh
    #! /bin/sh
    
    while true
    do
        date
        sleep 1
    done
    $ 
    
[/code]

下記のように起動してdocker attachすることができます。

[code]

    $ docker-compose up -d
    Starting compose_test_1 ... done
    $ docker attach compose_test_1 
    Thu Jun 28 07:24:15 UTC 2018
    Thu Jun 28 07:24:16 UTC 2018
    Thu Jun 28 07:24:17 UTC 2018
    Thu Jun 28 07:24:18 UTC 2018
    Thu Jun 28 07:24:19 UTC 2018
    Thu Jun 28 07:24:20 UTC 2018
    [Ctrl]-[p][Ctrl]-[q]
    
[/code]


CC BY-SA 4.0
2018-06-28T04:56:07.533
45116
2018-06-28T07:26:12.093
2018-06-28T07:26:12.093
5285
5285
45081
answer