linux - 在 Dockerfile 中运行 chown 什么都不做

标签 linux bash docker ubuntu docker-compose

我在使用 Docker 设置 Nuxt 和 Rails 容器时遇到了一些麻烦。这两个容器是分开的,但彼此交互。
目前,由于权限不足,我无法为 Nuxt 和 Rails 容器运行开发服务器。查看两个容器的日志,似乎 Docker 无法执行 mkdir 等操作.

EACCESS: Permission Denied: 'mkdir: /usr/src/app/.nuxt' # nuxt 
EACCESS: Permission Denied: 'mkdir: /usr/src/app/tmp' # rails
我的 docker-compose.dev.yml文件
version: 3
services:
  backend:
    privileged: true
    image: tablevibes-backend
    build:
      dockerfile: Dockerfile-dev
      context: tablevibes-backend
      args:
        UID: ${UID:-1001}
        BUNDLER_VERSION: 2.0.2
        PG_MAJOR: 10
        mode: development
    tty: true
    stdin_open: true
    volumes:
      - ./tablevibes-backend:/usr/src/app:Z
      - gem_data_api:/usr/local/bundle:cached
    ports:
      - "3000:3000"
    depends_on:
      - db
    user: rails
  client-ui:
    image: client-ui
    command: yarn run dev
    build:
      context: client-ui
      dockerfile: Dockerfile-dev
      args:
        UID: ${UID:-1001}
        PORT: 5000
        MODE: DEV
    restart: always
    volumes:
      - ./client-ui:/usr/src/app
      - client_ui_node_modules:/usr/src/app/node_modules:cached
    ports:
      - 5000:5000
    user: client-ui

2 个 Dockerfile
铁轨 Dockerfile-dev
FROM ruby:2.6.3

ARG PG_MAJOR
ARG BUNDLER_VERSION
ARG UID
ARG MODE
RUN adduser rails --uid $UID --disabled-password --gecos ""

# Add POSTGRESQL to the source list using the right version
RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
  && echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

ENV RAILS_ENV $MODE

RUN apt-get update -qq && apt-get install -y postgresql-client-$PG_MAJOR vim
RUN apt-get -y install sudo

WORKDIR /usr/src/app
CMD chown -R rails /usr/src/app
COPY Gemfile /usr/src/app/Gemfile
COPY Gemfile.lock /usr/src/app/Gemfile.lock
ENV BUNDLER_VERSION $BUNDLER_VERSION
RUN gem install bundler:$BUNDLER_VERSION

RUN bundle install

COPY . /usr/src/app

# Add a script to be executed every time the container starts.

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
Nuxt Dockerfile-dev
FROM node:10

ARG UID
ARG MODE=DEV
ARG PORT

RUN adduser client-ui --uid $UID --disabled-password --gecos ""

RUN apt-get update
RUN apt-get -y install sudo

RUN mkdir /usr/src/app
RUN chown -R client-ui /usr/src/app

COPY package.json yarn.lock /usr/src/app

RUN yarn install

COPY . /usr/src/app

ENV API_URL=http://localhost:3000/v1
ENV REVIEW_URL=http://localhost:8000

# expose 5000 on container
EXPOSE $PORT

# set app serving to permissive / assigned
ENV NUXT_HOST=0.0.0.0

# set app port
ENV NUXT_PORT=$PORT

我的问题是我做的那些行RUN chown ...似乎永远不会发生。如果我用 docker exec -u root -it backend bash 手动进入容器并运行 chown -R rails .手动,一切都按预期工作。同样,我尝试运行 chmod 777作为测试,但这对我不断收到的权限被拒绝错误也没有影响。
什么可能导致 Docker 忽略我的 chown命令?
This Stack Overflow question似乎相关,但它并不完全适用,因为我没有任何 VOLUME安装在我的 Dockerfile 中。已接受答案的评论中的用户有我同样的问题,但不幸的是没有解决方案。

最佳答案

容器就像食人魔或洋葱,它们有层。
使用 VOLUME 时s 或 MOUNT s,目录(或文件)实际上并不在容器中,而只是出现在容器中。
您的 Dockerfile 为 /usr/src/app 使用了一个层,您可能已经知道是您的 ./tablevibes-backend主机上的目录。

services:
  backend:
    volumes:
      - ./tablevibes-backend:/usr/src/app:Z
当您使用 volumemount这样,Docker 唯一能做的就是简单的 CRUD(创建、读取、更新、删除)选项,它不能(也不应该)在修改主机驱动器时修改元数据,这可能是一个安全问题。

关于linux - 在 Dockerfile 中运行 chown 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64176477/

相关文章:

bash - 退出 SSH 隧道而不关闭它

带有 Go 插件的 Dockerfile

java - 如何在Fabric8 Open Jdk Container中启用扩展编码?

linux - 编译时 Ubuntu 14.04 中的 Oracle Developer Studio : Cannot find sys/cdefs. h

linux - 如何通过命令行列出昨天在目录中修改的文件?

linux - 如何提取 ASA 916.bin 用于 GNS3?

Docker 注销 Azure

linux - 如何使用 Linux 调度程序将 CPU 核心限制为仅 2 个应用程序?

bash - 将管道输出传递给测试命令

macos - 如何使 bash 制表符完成功能像 Windows 的 cmd.exe 一样工作?