【发布时间】:2020-10-01 15:40:09
【问题描述】:
假设我有一个应用程序,我想测试某人是否知道如何处理 docker。为此,我准备了带有简单 docker-compose.yml 的工作 dockerfile,作为我使用 Rails 应用程序的示例,如下所示:
dockerfile
FROM ruby:2.7.1
RUN apt-get update -qq && apt-get install -y nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN gem install bundler
RUN bundle install
# Copy the main application.
COPY . ./
# Expose the applications port to the host machine
EXPOSE 3000
# Command to run when the container is started.
CMD bundle exec rails s -p 3000 -b '0.0.0.0'
docker-compose.yml
version: '3.8'
services:
app:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
所以现在我想用一些常见的错误来打破这些工作设置 - 你知道这些常见的错误吗?可能会删除端口或更改 dockerfile 中的应用程序位置,此类设置中常见的错误是什么?
【问题讨论】:
-
在我看来,您应该始终 (1) 关注 best practices,(2) 不要忘记实际设置您所拥有的
ENTRYPOINT,(3) 始终固定无论您要安装什么(最好将版本传递为ARG并将版本保存在容器ENV中),(4)lint yourDockerfile和(5)在多行上拆分apt-get update和apt-get install,在apt -get install中设置--no-install-recommends,(6)WORKDIR创建目录.. -
声明一个入口点而不使用它已经很有趣了。如果你想让它变得复杂,你可以重现这个问题中的错误:stackoverflow.com/questions/64156551/…
-
可以把它交给code review,并可以在考虑我如何故意搞砸之前向您展示我要更改的所有内容。
-
这是我为工作创建的故意破坏项目的示例:github.com/yields-io/broken-minimal-keycloak
标签: ruby-on-rails docker docker-compose