在 Docker 与 Docker Compose 中生成文件

Generating files in Docker vs. Docker Compose

我正在学习 Docker 并且有一点困惑,非常感谢您的建议。

创建新的 rails 应用程序时。遵循 Docker 教程 Quickstart: Compose & Rails 的指南。它们的步骤如下。

  1. 创建Docker文件和入口点
  2. 使用源代码创建 Gemfile 并列出 rails gem。
  3. 创建一个空的Gemfile.lock
  4. 创建 docker-compose.yml 和名称服务。
  5. 使用 docker-compose 运行 生成一个新的 rails 应用程序。

rails新命令。

docker-compose run --no-deps web rails new . --force -d mysql

这是我的简单Docker文件:

FROM ruby:3.1.1-alpine3.15

RUN apk update -q
RUN apk add bash yarn git build-base nodejs mariadb-dev tzdata

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

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

RUN gem install bundler
RUN gem update bundler
RUN bundle install

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

EXPOSE 3000

这是我的docker-compose.yml:

version: "3.9"
services:
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"

如您所见,我的 docker-compose.yml 中只列出了一项服务,因为我不需要任何其他服务或容器。

当我使用命令 docker-compose 运行 rails new 时一切正常...它生成一个新的 rails 应用程序并将文件保存到我的本地源文件夹。所以我可以打开和编辑文件来开发应用程序。完美。

但是当我尝试在不使用 docker-compose.yml 且仅使用 Docker 文件的情况下生成新的 Rails 应用程序时。生成的文件不会保存在我的本地源文件夹中,只会保存在容器中。我只能假设是因为我被迫在 运行 将其放入容器中以生成新的 rails 应用程序之前构建图像。

不使用 docker-compose.yml 时。我必须先构建图像。

docker build -t image_name .

然后我可以 运行 容器并生成 rails 应用程序。

docker run image_name rails new . --force -d mysql

显然,这不会将新文件保留在我的本地源文件夹中。

如何只用我的 Docker 文件生成一个新的 Rails 应用程序,而不用 docker 撰写,并且仍然让新生成的文件保留在我的本地源中文件夹?

我一定是遗漏了什么,但我已经做了很多研究,但找不到答案。

在 docker-compose.yml 中,您有一个 'volumes' 密钥,如下所示。

volumes:
  - .:/app

但是在 CLI 中使用它时,您会错过传递这些卷。

您可以按照下面的代码传递这些卷。

docker run -d --name=rails --volume /your/workdir:/app image_name

如果您想了解有关卷的更多信息,可以找到 here