Docker 为 Rails 作曲

Docker Compose for Rails

我正在尝试在 docker-compose.yml 文件

中复制此 docker 命令
docker run --name rails -d -p 80:3000 -v "$PWD"/app:/www -w /www -ti rails

我的docker-compose.yml文件:

rails:
    image: rails
    container_name: rails
    ports:
        - 80:3000
    volumes:
        - ./app:/wwww

当我执行 docker-compose up -d 时,容器已创建,但没有分层。

当我将 tty: true 添加到我的 docker docker-compose.yml 文件,容器启动良好,但我的卷未安装。

如何在 docker-compose.yml 中精确地复制我的 docker 命令?

有一些方法可以解决您的问题。

解决方法一:如果你想在你的docker-compose.yml中使用rails图片,你需要设置命令和它的工作目录,如

rails:
    image: rails
    container_name: rails
    command: bash -c "bundle install && rails server -b 0.0.0.0"
    ports:
        - 80:3000
    volumes:
        - ./app:/www
    working_dir: /www

这将在您每次 运行 docker-compose up.

时从 rails 图像创建一个新容器

解决方法二:将你的docker-compose.yml移动到与Gemfile相同的目录下,并在该目录下按顺序创建Dockerfile提前构建一个docker容器(避免每次运行宁bundle install

#Dockerfile
FROM rails:onbuild

我这里使用rails:onbuild是为了简单起见(关于rails:onbuild和[=19=的区别,请看documentation)。

之后,将docker-compose.yml修改为

rails:
  build: .
  container_name: rails
  ports:
    - 80:3000
  volumes:
    - .:/www
  working_dir: /www

运行 docker-compose up 这应该可行!

如果您修改了 Gemfile,您可能还需要在 运行docker-compose up.

之前通过 docker-compose build 重建您的容器

感谢您的回答。它帮助我找到了解决方案。

其实是音量的问题。我想用目录 /www 挂载卷。但这是不可能的。 所以我使用了 rails 图片默认使用的目录: /usr/src/app

rails:
    image: rails
    container_name: rails
    ports:
        - 80:3000
    working_dir: /usr/src/app
    volumes:
        - ./app:/usr/src/app
    tty: true

现在我的 docker-compose up -d 命令可以工作了