Ruby on rails 无法停止或删除Docker容器-权限被拒绝错误
问题:无法停止docker容器,每当我尝试停止容器时,都会收到以下错误消息Ruby on rails 无法停止或删除Docker容器-权限被拒绝错误,ruby-on-rails,docker,docker-compose,docker-swarm,Ruby On Rails,Docker,Docker Compose,Docker Swarm,问题:无法停止docker容器,每当我尝试停止容器时,都会收到以下错误消息 ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc
ERROR: for yattyadocker_web_1 cannot stop container: 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: Cannot kill container 1f04148910c5bac38983e6beb3f6da4c8be3f46ceeccdc8d7de0da9d2d76edd8: rpc error: code = PermissionDenied desc = permission denied
操作系统版本/构建:Ubuntu 16.04 | Docker版本17.09.0-ce,构建afdb6d4 | Docker Compose版本1.17.1,构建6d101fb
复制步骤:
# docker-compose.yml
version: '3'
volumes:
db-data:
driver: local
redis-data:
driver: local
services:
db:
image: postgres:9.4.1
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
env_file: local_envs.env
web:
image: yattya_docker:latest
command: bundle exec puma -C config/puma.rb
tty: true
stdin_open: true
ports:
- "3000:3000"
links:
- db
- redis
- memcached
depends_on:
- db
- redis
- memcached
env_file: local_envs.env
redis:
image: redis:3.2.4-alpine
ports:
# We'll bind our host's port 6379 to redis's port 6379, so we can use
# Redis Desktop Manager (or other tools) with it:
- 6379:6379
volumes:
# We'll mount the 'redis-data' volume into the location redis stores it's data:
- redis-data:/var/lib/redis
command: redis-server --appendonly yes
memcached:
image: memcached:1.5-alpine
ports:
- "11211:11211"
clock:
image: yattya_docker:latest
command: bundle exec clockwork lib/clock.rb
links:
- db
depends_on:
- db
env_file: local_envs.env
worker:
image: yattya_docker:latest
command: bundle exec rake jobs:work
links:
- db
depends_on:
- db
env_file: local_envs.env
- 使用Dockerfile和docker-compose.yml创建了rails项目。docker-compose.yml是版本3
- 使用
或docker build-t.
docker compose-up--build成功构建映像
- 容器启动并成功运行
- 尝试在docker compose关闭时停止docker compose
- 我必须运行
,然后才能移除容器sudo service docker restart
- 卸载docker,删除docker目录,然后重新安装所有内容。仍然面临同样的问题李>
sudo service docker restart
,然后才能移除容器。但这非常不方便,我不知道如何解决这个问题
参考文件:
# docker-compose.yml
version: '3'
volumes:
db-data:
driver: local
redis-data:
driver: local
services:
db:
image: postgres:9.4.1
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
env_file: local_envs.env
web:
image: yattya_docker:latest
command: bundle exec puma -C config/puma.rb
tty: true
stdin_open: true
ports:
- "3000:3000"
links:
- db
- redis
- memcached
depends_on:
- db
- redis
- memcached
env_file: local_envs.env
redis:
image: redis:3.2.4-alpine
ports:
# We'll bind our host's port 6379 to redis's port 6379, so we can use
# Redis Desktop Manager (or other tools) with it:
- 6379:6379
volumes:
# We'll mount the 'redis-data' volume into the location redis stores it's data:
- redis-data:/var/lib/redis
command: redis-server --appendonly yes
memcached:
image: memcached:1.5-alpine
ports:
- "11211:11211"
clock:
image: yattya_docker:latest
command: bundle exec clockwork lib/clock.rb
links:
- db
depends_on:
- db
env_file: local_envs.env
worker:
image: yattya_docker:latest
command: bundle exec rake jobs:work
links:
- db
depends_on:
- db
env_file: local_envs.env
和Dockerfile:
# Dockerfile
FROM ruby:2.4.1
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
ENV APP_HOME /app
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install
ADD . $APP_HOME
RUN mkdir -p ${APP_HOME}/log
RUN cat /dev/null > "$APP_HOME/log/development.log"
RUN mkdir -p ${APP_HOME}/tmp/cache \
&& mkdir -p ${APP_HOME}/tmp/pids \
&& mkdir -p ${APP_HOME}/tmp/sockets
EXPOSE 3000
我能够解决这个问题。由于未知问题,ubuntu中的Apparmor服务无法正常工作。该问题与moby项目中报告的问题类似
/etc/apparmor.d/tunables
文件夹为空,建议清除/重新安装apparmor,使其恢复初始状态。
因此,我重新安装了apparmor,重新启动后,问题得到了解决
希望这能有所帮助。对于不希望完全清除AppArmor的人 检查状态:
sudo aa状态
关闭并阻止其重新启动:sudo systemctl disable apparmor.service--现在
卸载装置配置文件:sudo服务装置拆卸
检查状态:sudo aa状态
你现在应该可以停止/杀死容器了。在我的例子中,问题是我的docker安装有冲突:
docker
本身来自官方,而docker compose
来自Ubuntu快照包
从官方github()正确安装docker compose实现了这一目的。我还遵循了,这可能也有帮助(以非root用户的身份运行docker)
我只是把AppArmor一个人留在这里-我没有碰它。这个问题的一个直接解决方法是在要终止的容器中执行bash,并在那里直接调用
kill
。例如:
host$ docker exec -it <container-name> sh
container$ ps
PID USER TIME COMMAND
1 root 0:00 {entrypoint.sh} /bin/sh /entrypoint.sh
16 root 0:00 {entrypoint.sh} /bin/sh /entrypoint.sh
24 root 0:00 sh
31 root 0:00 ps
container$ kill 1
host$docker exec-it sh
集装箱$ps
PID用户时间命令
1根0:00{entrypoint.sh}/bin/sh/entrypoint.sh
16根0:00{entrypoint.sh}/bin/sh/entrypoint.sh
24:00上海时间
31根0:00 ps
集装箱$kill 1
要检查容器是否已终止,请运行
docker ps
。这是解决方案重新安装apparmor的一个有用的替代方案,因为这也将从snap软件包中删除snapd我安装了Docker,过了一段时间,我决定转到apt存储库安装
我也面临同样的问题,使用
sudo aa remove unknown
对我来说很有效
因此不需要重新安装Apparmor。哪个用户启动容器?我在ubuntu上启动容器。。安装docker时创建的docker用户必须用于管理容器。我是docker的新手。您是否已将您的用户帐户添加到docker组
sudousermod-aG docker${USER}
这将允许您在没有sudo@ShawnC是正确的(至少我怀疑)。要验证,您可以运行“sudo docker compose”或“sudo docker compose down”。@charlieviellard如果您正确设置了sudo usermod-aG docker${USER}
,并且仍然面临问题,那么您可能需要检查apparmor是否工作正常。我与apparmor有问题,因此我重新安装了docker和apparmor。重启笔记本电脑后,问题就解决了。我认为这个问题和docker hub论坛的更多细节有关:注意!一些应用程序在此之后将无法启动请注意,任何包含apparmor
的解决方案都会破坏snap和通过snap安装的所有软件包,即使在这之后,我仍然无法在kubernetes上运行和杀死POD。我遵循了上述步骤。现在我的一些应用程序不再启动了。我怎样才能解决这个问题?@HerthaBSC我也有同样的问题。IntelliJ停止了工作。我设法把它修好了。使用sudo-apt-purge-snap和&sudo-apt-install-snap
解决了这个问题。但我想它会清除那些没有启动的应用程序。IntelliJ,就我而言。所以,我不得不重新安装它。但是一旦你重新启动系统,你必须重复这个过程。您是否找到了永久解决方案?如果我没记错,我按照上述解决方案中的说明禁用了AppArmor,然后重新安装Docker,然后使用sudo systemctl enabled AppArmor
和sudo systemctl start AppArmor
重新启用AppArmor。这不起作用,它只是列出了我案例中的sh
和ps
流程(来自docker compose文件),工作起来很有魅力,谢谢你,这是正确的非核心答案。将Docker安装为snap
会添加一组AppArmor配置文件,这些配置文件与apt
安装冲突。这是偶然发生在我身上的,因为我正在寻找一种方便的方法来安装Docker。最后选择了一个apt
安装,因为它给了我更多的控制,而且更为最新。完美的答案!!它对我来说非常有效。使用sudo aa remove unknown
导致我的mysql工作台无法工作