はじめに
DockerでCentOS7のコンテナを起動したところ、起動直後にステータスがExit 0となって終了し、コンテナに起動できなくなる事象が発生した。
本記事では原因と対処方法を記載する。
システム環境
各種バージョン
- Dockerホストサーバ
- Oracle Linux Server release 7.9
- Docker 19.03.11
- docker-compose 1.29.2
- Dockerコンテナ
- CentOS 7
Docker構成ファイル
docker-compose.yml
version: '3'
services:
testserver1:
image: testserver:vrfy
build: ./testserver
hostname: testserver1
networks:
- dockernet
testserver2:
image: testserver:vrfy
build: ./testserver
hostname: testserver2
networks:
- dockernet
networks:
dockernet:
Dockerfile
FROM centos:7
発生事象
docker-compose buildコマンドでpull & buildする。
[root]# docker-compose build
Building testserver1
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM centos:7
Trying to pull repository docker.io/library/centos ...
7: Pulling from docker.io/library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
---> 8652b9f0cb4c
Successfully built 8652b9f0cb4c
Successfully tagged testserver:vrfy
Building testserver2
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM centos:7
---> 8652b9f0cb4c
Successfully built 8652b9f0cb4c
Successfully tagged testserver:vrfy
[root]#
docker-compose upコマンドでコンテナを起動する。
[root]# docker-compose up -d
Creating network "test_dockernet" with the default driver
Creating test_testserver2_1 ... done
Creating test_testserver1_1 ... done
[root]#
docker-compose psコマンドでコンテナ状態を確認すると、StateがExit 0となっており、終了してしまっている。
[root]# docker-compose ps
Name Command State Ports
-----------------------------------------------
test_testserver1_1 /bin/bash Exit 0
test_testserver2_1 /bin/bash Exit 0
[root]#
ログインしようとするも、エラーになりログイン不可。
[root]# docker exec -it test_testserver1_1 bash
OCI runtime exec failed: exec failed: cannot exec a container that has stopped: unknown
[root]# docker exec -it test_testserver1_1 /bin/bash
Error response from daemon: Container e880d5f7132fa2d0a01b820bb05e1779c28b2b8a2674d3fd652a5b0199bf8092 is restarting, wait until the container is running
[root]#
原因・対処方法
原因はコンテナが標準入力を受け付ける状態になっていないためだった。
docker-compose.ymlファイルにstdin_open: trueを追加することで解決した。
docker-compose.yml(修正後)
version: '3'
services:
testserver1:
image: testserver:vrfy
build: ./testserver
hostname: testserver1
networks:
- dockernet
stdin_open: true ★追加
testserver2:
image: testserver:vrfy
build: ./testserver
hostname: testserver2
networks:
- dockernet
stdin_open: true ★追加
networks:
dockernet:
この設定でコンテナを起動すると、StateがUpとなり、ログインできるようになった。
[root]# docker-compose up -d
Creating network "test_dockernet" with the default driver
Creating test_testserver1_1 ... done
Creating test_testserver2_1 ... done
[root]#
[root]# docker-compose ps
Name Command State Ports
----------------------------------------------
test_testserver1_1 /bin/bash Up
test_testserver2_1 /bin/bash Up
[root]#
[root]# docker exec -it test_testserver1_1 bash
[root@testserver1 /]# uname -n
testserver1
[root@testserver1 /]#