【问题标题】:Docker: How to use a Dockerfile in addition to docker-compose.ymlDocker:除了 docker-compose.yml 之外,如何使用 Dockerfile
【发布时间】:2021-10-25 15:06:44
【问题描述】:

我正在使用这个 repo 来建立一个本地的 wordpress 开发环境: https://github.com/mjstealey/wordpress-nginx-docker#tldr

我劫持了docker-compose来更改nginx端口,还尝试在nginx服务器上安装openssl和vim。但是当我执行 docker-compose up 时,nginx 服务器永远无法正常启动。

这是我看到的:

CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS                          PORTS                    NAMES
57cf3dff059f   nginx:latest           "bash"                   About a minute ago   Restarting (0) 14 seconds ago                            nginx

我尝试像这样在 docker-compose 中引用一个 Dockerfile:

  nginx:
    image: nginx:${NGINX_VERSION:-latest}
    container_name: nginx
    ports:
      - '8085:8085'
      - '443:443'
    build: .
    volumes:
      - ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
      - ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
      - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
      - ${SSL_CERTS_DIR:-./certs}:/etc/letsencrypt
      - ${SSL_CERTS_DATA_DIR:-./certs-data}:/data/letsencrypt
    depends_on:
      - wordpress
    restart: always

请注意显示“build: .”的行。 这是我的 Dockerfile 的内容:

FROM debian:buster-slim
RUN apt-get update

# installing vim isn't necessary.  but just handy.
RUN apt-get -y install openssl
RUN apt-get -y install vim

很明显,我做错了什么。也许我应该直接在 docker-compose 中为 nginx 服务器定义任务? 我想找到一种方法来将我们的定制和原始代码完全分开。但也许这是不可能的。

谢谢

编辑 1

这就是 Dockerfile 的样子:

FROM nginx:latest
RUN apt-get update
  && apt-get -y install openssl
  && apt-get -y install vim

还有 docker-compose.yml 的 nginx 部分:

  nginx:
    #image: nginx:${NGINX_VERSION:-latest}
    container_name: nginx
    ports:
      - '8085:8085'
      - '443:443'
    build: .
    volumes:
      - ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
      - ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
      - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
      - ${SSL_CERTS_DIR:-./certs}:/etc/letsencrypt
      - ${SSL_CERTS_DATA_DIR:-./certs-data}:/data/letsencrypt
    depends_on:
      - wordpress
    restart: always

【问题讨论】:

  • 您对docker build 使用的确切命令是什么?您在运行docker-compose up 时是否看到任何错误?
  • Nginx 运行时如何使用vimopenssl 二进制文件;你可以使用未修改的nginx 图像吗?如果您确实需要这些更改,您应该尝试在单个 apt-get install 命令中安装所有软件包(这会明显更快)并且您应该在单个命令中 RUN apt-get update && apt-get install(以避免重建时出现层缓存问题)。
  • 你应该阅读the docs中的Using environment variables in nginx configuration (new in 1.19)
  • @code_monk - 我会看看,但我不认为这是我的问题的根本原因?因为......没有对我的新 Dockerfile 的构建引用,一切都像使用最新的 nginx 映像一样工作......

标签: docker nginx docker-compose


【解决方案1】:

我认为您可能需要更改您在 docker 文件中使用的基本映像?:

FROM nginx:latest

然后在 docker 文件中,因为您正在创建自己的自定义版本的 nginx 映像,所以您应该提供自定义名称或标签。

【讨论】:

  • 特别是,不要在docker-compose.yml 文件中image: nginx;这将导致 Docker Hub nginx 映像的本地副本被您的自定义映像覆盖。如果您不打算将图像推送到存储库,则完全省略 image: 行是安全的。
  • 这似乎没有解决问题。我仍然有同样的行为。请参阅我的帖子中的编辑 1,了解文件现在的样子。谢谢!
  • 可能值得再次拉取图像,因为如果我没记错的话,原始问题中 docker-composr 和 docker 文件的组合很可能会覆盖 nginx 文件
  • 我删除了 nginx 映像并使用编辑 1 中显示的代码重新运行 docker-compose up。它根本没有下载新的 nginx 映像。
  • 我在 Dockerfile 的每一行都缺少尾随的“\”。我修复了该语法错误,并且还清除了旧的 nginx 映像。现在它可以工作了,我安装了 vim 和 openssl。谢谢。
猜你喜欢
  • 2017-03-12
  • 2018-05-16
  • 2018-05-28
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多