通过docker-compose运行web rails g控制器生成的文件没有编辑权限

Aje*_*han 8 ruby-on-rails docker docker-compose

docker-compose用来为开发人员提供环境.应用程序在docker-compose build命令上正常运行并在0.0.0.0:3000on docker-compose up命令上运行.当我尝试运行命令docker-compose run web rails g controller以生成带有操作的控制器时,生成的文件比没有在主机上编辑的权限.

Dockerfile

FROM ubuntu:14.04
FROM ruby:2.2.1
# Run updates
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

# Set up working directory
RUN mkdir /xyz/
WORKDIR /xyz/

# Set up gems
ADD Gemfile /xyz/Gemfile
ADD Gemfile.lock /xyz/Gemfile.lock

RUN bundle install

# Finally, add the rest of our app's code
# (this is done at the end so that changes to our app's code
# don't bust Docker's cache)
ADD . /xyz
Run Code Online (Sandbox Code Playgroud)

我甚至试图添加一个用户,xyzuser但没有工作.

# Create a user imliuser to run app that is not root
RUN useradd --create-home --home-dir /xyz --shell /bin/bash xyzuser
RUN chown -R xyzuser /xyz 
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml

db:
  image: postgres
  ports:
    - "5432"

redis:
  image: redis
  ports:
    - "6379"


web:
  build: .
  command: bundle exec rails s -b 0.0.0.0
  volumes:
    - .:/xyz:rw
  ports:
    - "3000:3000"
  links:
    - db
    - redis
Run Code Online (Sandbox Code Playgroud)

当我跑步时docker-compose build,也会收到警告don't run bundler as root.

我得到的另一个错误是当捆绑器开始安装gems时,作为公共git repo列出的gem无法安装.

gem 'workflow', :git => 'git@github.com:xyz/workflow.git',
:branch =>'feature_state_to_integer'
Run Code Online (Sandbox Code Playgroud)

得到以下错误.

Host key verification failed.
fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)

即使存储库是公开的

Héc*_*eja 5

您将提出问题中的三个问题:

  1. 您无权访问docker在已安装卷中写入的文件。
  2. 您会得到警告语don't run bundle as root
  3. 您无权访问github,因为Host key verification failed

在我的建议下面找到每个建议:

1)您可以访问主机系统中的任何文件root。因此,我假设您没有,但您的用户在docker组中,被允许运行docker命令。首先,找到该用户的用户ID:

id -u xyzuser
1000
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,用户ID为1000。然后,useradd以与发布相同的方式将命令添加到Dockerfile中,但添加一个附加参数(-u):

RUN useradd -u 1000 --create-home --home-dir /xyz --shell /bin/bash xyzuser
Run Code Online (Sandbox Code Playgroud)

最后,运行docker容器xyzuser(请参阅下一点)。因此,您已经使主机和docker容器都了解它们使用的是同一用户,而不只是两个具有相同名称的不同用户。

另外,您也可以使用 USER Dockerfile中指令在构建过程中指定用户,如删除答案中所述。

2)错误非常明显,您不能以root用户身份运行bundler,我想说您的解决方案是更改要在docker容器内运行命令的用户。您可以user在.yaml文件中使用参数进行更改。例:

web:
  build: .
  user: xyzuser
  command: bundle exec rails s -b 0.0.0.0
  volumes:
    # Avoid to use relative paths during
    # testing stage
    - /abs/path/to/current:/xyz
  ports:
    - "3000:3000"
  links:
    - db
    - redis
Run Code Online (Sandbox Code Playgroud)

3)要解决该Host key verification ...错误,您需要设法将主机添加到容器known_hosts文件中。这样做的方法如下:

ssh-keyscan -H github.com >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

在您的docker文件中,您可以添加以下行:

RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

在宝石镶嵌之前。确保将主机密钥添加到将要连接到github的实际用户的.ssh目录中。

这样做的原因是因为您通过连接到github,ssh并且此协议使用“指纹”来标识客户端的服务器。如果您想了解更多有关此问题的信息,请查看Giles的答案:https : //unix.stackexchange.com/questions/42643/ssh-key-based-authentication-known-hosts-vs-authorized-keys


dne*_*hin 2

Docker 容器默认以 root 用户身份运行您的应用程序。您必须将sudo chown他们设置为您的用户,或者在图像中创建具有相同用户 ID 的用户。