使用 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'
我有一个 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'