使用 docker-compose 设置容器时区

Using docker-compose to set containers timezones

我有一个 docker-compose 文件 运行 几个 Dockerfile 来创建我的容器。我不想编辑我的 Dockerfile 来设置时区,因为我的团队成员可以随时更改时区,而且我有一个 docker-compose.override.yml 文件来更改本地环境。但是,我的一个容器(基于 Selenium 的容器)似乎没有拉出主机时区,这给我带来了问题。基于此,我想在我所有的容器上强制执行时区。在我的 Dockerfiles 中,我现在做

ENV TZ=America/Denver
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

一切正常。如何在 docker-compose 语法中复制相同的命令?

version "2"

services:
  serviceA:
    ...
    environment:
      TZ: "America/Denver"
    command: >
      sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && 
      echo $TZ > /etc/timezone &&
      exec my-main-application"

编辑:问题并没有要求它,但我刚刚添加了 exec my-main-application 以显示如何指定主要流程。 exec 在这里很重要,以确保 my-main-application 接收到 Ctrl-C (SIGINT/SIGKILL)。

最简单的解决方案是在 docker-compose.yml 中共享音量,就像这样

ipchanger:
  image: codertarasvaskiv/ipchanger:raspberry
  volumes:
    - "/etc/localtime:/etc/localtime:ro"
  • ro - 表示容器只能从主机的 /etc/localtime 读取。

这是简单的解决方案:

environment:
  - TZ=America/Denver
version: '3.6'
services:
  mysql:
    image: mysql:5.6
    restart: always
    container_name: dev-mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
     - TZ=Asia/Shanghai
     - MYSQL_ROOT_PASSWORD=password # set the root password
    ports:
      - '3306:3306'
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
      - "/etc/timezone:/etc/timezone:ro"

这是我的 docker-compose.yaml mysql

提醒,您需要重新创建容器,而不是重新启动。 如果更改 yaml 需要重新创建

docker-compose -f docker-compose.yaml stop
docker-compose -f docker-compose.yaml rm
docker-compose -f docker-compose.yaml start
 version: '2'
 services:
   ServiceA:
     image: image:
   - '/etc/localtime:/etc/localtime:ro'