在 Docker 与 Docker Compose 中生成文件
Generating files in Docker vs. Docker Compose
我正在学习 Docker 并且有一点困惑,非常感谢您的建议。
创建新的 rails 应用程序时。遵循 Docker 教程 Quickstart: Compose & Rails 的指南。它们的步骤如下。
- 创建Docker文件和入口点
- 使用源代码创建 Gemfile 并列出 rails gem。
- 创建一个空的Gemfile.lock
- 创建 docker-compose.yml 和名称服务。
- 使用 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。
我正在学习 Docker 并且有一点困惑,非常感谢您的建议。
创建新的 rails 应用程序时。遵循 Docker 教程 Quickstart: Compose & Rails 的指南。它们的步骤如下。
- 创建Docker文件和入口点
- 使用源代码创建 Gemfile 并列出 rails gem。
- 创建一个空的Gemfile.lock
- 创建 docker-compose.yml 和名称服务。
- 使用 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。