我在使用 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
当您使用 volume
或 mount
这样,Docker 唯一能做的就是简单的 CRUD(创建、读取、更新、删除)选项,它不能(也不应该)在修改主机驱动器时修改元数据,这可能是一个安全问题。
关于linux - 在 Dockerfile 中运行 chown 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64176477/