【Docker】コンテナにROOTで入る方法
【Docker】コンテナにROOTで入る方法
Dockerfileの構築時にUserを決めてしまうことがあります。
その状態でいつものおまじないをするとROOTじゃないのでアプリインストールが出来ないなど不都合も発生します。
と言う事で、コンテナにROOTで入るための備忘録です。
参考用のdocker-compose.yml
version: '3'
services:
nginx:
image: nginx:1.17
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
depends_on:
- python
mysql:
image: mysql:5.7
container_name: SQL_CON
volumes:
- ./mysql/data:/var/lib/mysql
- ./logs:/var/log/mysql
- ./entrypoint/initdb.d/client/:/docker-entrypoint-initdb.d
- ./entrypoint/startdata/:/start-data
env_file: ./mysql/.env.dev
ports:
- "3306:3306"
python:
container_name: PY_CON
build: ./python
command: uwsgi --socket :8001 --module mysite.wsgi --logto /tmp/uwsgi.log
volumes:
- ./src:/code
- ./static:/static
expose:
- "8001"
depends_on:
- mysql
restart: always
こんな感じで作ったコンテナに対してROOTログインしてみたいと思います。
手段は2つあります。
- サービス名を指定して docker-compose で入る
- コンテナIDを指定してdocker で入る
docker-composeで入る方法
私は普段のログインでdocker-composeを利用しているので馴染みやすいです。
user rootで入るよと宣言してログインするサービス名を記載します。
具体的には下の様になります。
sudo /usr/local/bin/docker-compose exec --user root python bash
具体例で記載しているpythonは【docker-compose.yml】に記載したサービス名です。
docker-composeにパスを通している場合は[ /usr/local/bin/ ]省略してdocker-composeでOKです。
コンテナIDを指定してdockerで入る方法
コンテナIDを記載する必要があるので【sudo docker ps -a】で必ずIDを把握しておきましょう。
具体的には下の様になります。
sudo docker exec -it -u root 25fa816006b2 bash
【コンテナID】はコンテナイメージ名やサービス名に置き換える事はできません。
なので、現在立ち上がっているコンテナIDを【sudo docker ps -a】で調べる必要があります。
複数のサイトを管理している場合は同じサービス名で動けるdocker-compose利用が共通化出来ていいですね。
でも文字数が少ないのはdockerの方です。
まとめ
今回のこの記事は私のポカから生まれたものです。
立ち上げたコンテナにvimが入ってなかったため インストールしようとした所「permission 確認しろ」とはねられたんです。で、(root権限あると思い込んでるので)命令の書き方変えてみたり、OS違う奴入れて命令違うのか?とか右往左往。
DockerfileでUser指定してるからコンテナにrootで入ってないし、root権限持たせて無いし、そもそもsudo入れてないし、と。まぁ一番はDockerfileでvim入れとけって事なんですけどね。と言う事で今はvimインストール書いたDockerfileに作り変えました。


